设计模式之享元模式

内容抄自《设计模式》清华大学出版社,2011

模式动机:     在一个软件中很有可能要使用大量相同或相似的对象,而创建这些相似的对象会大量消耗系统资源,类似
围棋,在围棋中,需要创建大量的棋子,而这些棋子只是颜色与位置不同,这个时候就可以用享元模式来解决这个问题。

模式定义:
运用共享技术有效地支持大量细粒度对象的复用,系统只使用少量的对象,而这些对象都很相似,状态变化很小,
可以实现对象的多次复用,由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式。

模式结构:

设计模式之享元模式

包含角色:
1.Flyweight(抽象享元类->围棋) 内部状态在私有属性,外部状态在于操作的时候传参数
2.ConcreteFlyweight(具体享元类->黑白棋子)
3.UnsharedConcreteFlyweight(非共享具体享元类->直接实例化创建)
4.FlyweightFactory(享元工厂类)

模式分析:核心代码
public class FlyweightFactory{
    private HashMap<String,Flyweight> cache = new HashMap<>();
    public Flyweight get(String key){
        if(cache.containsKey(key)){
            return cache.get(key);
        }
        else{
            Flyweight fw = new ConcreteFlyweight();
            cache.put(key,fw);
            return fw;
        }
    }
}

优点:
1.极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份
2.享元模式的外包状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享

缺点:
1.享元模式使得系统变复杂,需要分离出内部状态和外部状态,使得程序逻辑复杂化
2.影响对象之间的等于判断

适用环境:
1.一个系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费
2.享元模式需要维护一个存储享元对象的享元池,需要耗费资源,所以应该在多次重复使用享元对象时才值得使用享元模式

栗子:围棋(这个栗子是网上看的,谁的也不知道)

设计模式之享元模式