Java设计模式-14、享元模式-实现对象的复用

第14章:享元模式-实现对象的复用定义:享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。为了避免系统中出现大量相同或相似的对象在逻辑上每一个出现的字符都有一个对象与之对应,然而在物理上它们却共享同一个享元对象围棋棋盘中包含大量的黑子和白子,它们的形状、大小都一模一样,只是出现的位置不同而已。将具有相同内部状态的对象存储在享元池中享元池中的对象是可以实现共享的,需要的时候
摘要由CSDN通过智能技术生成

第14章:享元模式-实现对象的复用

定义:

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。

为了避免系统中出现大量相同或相似的对象

逻辑上每一个出现的字符都有一个对象与之对应,然而在物理上它们却共享同一个享元对象

围棋棋盘中包含大量的黑子和白子,它们的形状、大小都一模一样,只是出现的位置不同而已。

image-20201106155059073

将具有相同内部状态的对象存储在享元池中

享元池中的对象是可以实现共享的,需要的时候就将对象从享元池中取出实现对象的复用。通过向取出的对象注入不同的外部状态,可以得到一系列相似的对象,而这些对象在内存中实际上只存储一份。

image-20201106155240984

内部状态:

不会随环境改变而改变的状态,可以共享,如a。

外部状态:

是随环境改变而改变的、不可以共享的状态,有的“a”是红色的,有的“a”是绿色的,字符的大小也是如此。

结构:

image-20201106155847017

代码实现:

//享元工厂类
class FlyweightFactory {
   
    //定义一个HashMap用于存储享元对象,实现享元池
    private HashMap flyweights = new HashMap();

    public Flyweight getFlyweight(String key) {
   
        //如果对象存在,则直接从享元池获取
        if (flyweights.containsKey(key)) {
   
            return (Flyweight) flyweights.get(key);
        }
        //如果对象不存在,先创建一个新的对象添加到享元池中,然后返回
        else {
   java
            Flyweight fw = new ConcreteFlyweight();
            flyweights.put(key, fw);
            return fw;
        }
    }
}
//享元类
class Flyweight {
   
    //内部状态intrinsicState作为成员变量,同一个享元对象其内部状态是一致的
    private String intrinsicState;

    public Flyweight(String intrinsicState) {
   
        this.intrinsicState = intrinsicState;
    }

    //外部状态extrinsicState在使用时由外部设置,不保存在享元对象中,即使是同一个对象
    public void operation(String extrinsicState) {
   
            //......
    }
}

应用实例:

使用享元模式设计围棋棋子

image-20201106160540644

//围棋棋子类:抽象享元类
abstract class IgoChessman {
   

    public abstract String getColor();

    public void display() {
   
        System.out.println("棋子颜色:" + this.getColor());
    }
}
//黑色棋子类:具体享元类
class BlackIgoChessman extends IgoChessman {
   
    public String getColor() {
   
        return "黑色";
    }
}

//白色棋子类:具体享元类
class WhiteIgoChessman extends IgoChessman {
   
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值