zoukankan      html  css  js  c++  java
  • Java设计模式(11)——结构型模式之享元模式(Flyweight)

    一、概述

      概念

    避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。

      UML简图

      单纯享元模式

      

      角色

      抽象享元角色(Flyweight):定义享元子类公共接口

       具体享元角色(ConcreteFlyweight):具体享元类,实现实例共享

      享元工厂(FlyweightFacotry):创建和管理享元角色

      客户端:维护一个对所有享元对象的引用,自行存储外部状态。

    • 内部状态是存储在享元对象内部,一般在构造时确定或通过setter设置,并且不会随环境改变而改变的状态,因此内部状态可以共享。
    • 外部状态是随环境改变而改变、不可以共享的状态。外部状态在需要使用时通过客户端传入享元对象。外部状态必须由客户端保存。

       对于以上两种状态不是很明白可以等下文的代码中具体体会!

      更加具体的内外状态的示例:在咖啡店里,咖啡有“口味”之分,也就是口味可以作为咖啡的内部状态,而咖啡做好后送到对应桌号的桌子上,由于桌子是不固定的,故桌子作为外部状态。  --参考自《Java与模式》的例子

      复合享元模式

      

      应用场景

      

     二、实践

      就按照单纯享元模式进行代码的创建

      抽象享元接口

    /**
     * 抽象享元角色
     *
     * @author Administrator
     **/
    public abstract class Flyweight {
        /**
         *接口方法
         * @param externalState 外部状态,由客户端传入
         */
        public abstract void method1(String externalState);
    }

      具体享元类

    /**
     * 具体享元角色
     *
     * @author Administrator
     **/
    public class ConcreteFlyweight extends Flyweight{
        /**
         * 内部状态,构建时确定
         */
        private String internalState;
    
        public ConcreteFlyweight(String internalState) {
            this.internalState = internalState;
        }
    
        @Override
        public void method1(String externalState) {
            System.out.println("内部状态:"+internalState);
            System.out.println("外部状态:"+externalState);
        }
    }

      享元工厂

    /**
     * 享元工厂
     *
     * @author Administrator
     **/
    public class FlyweightFactory {
        private static Map<String, Flyweight> flyweightMap = new HashMap<>();
        public static Flyweight getFlyweight(String state) {
            if (flyweightMap.get(state) == null) { // flyweightMap.containsKey(state)
                Flyweight flyweight = new ConcreteFlyweight(state);
                flyweightMap.put(state, flyweight);
            }
            return flyweightMap.get(state);
        }
    }

    三、思考与改进

      什么条件下使用享元模式

      

  • 相关阅读:
    「题解」洛谷 P1169 [ZJOI2007]棋盘制作
    「题解」洛谷 P4147 玉蟾宫
    dsu on tree 学习笔记
    [USACO08FEB]Hotel G「线段树」
    城市环路「树形DP」
    Siano「线段树」
    Emiya 家今天的饭「容斥+DP」
    Matlab调用其他文件夹下的函数
    基于小波金字塔的简单图像融合算法matlab实现
    知网引文网络使用方法
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7750975.html
Copyright © 2011-2022 走看看