享元模式

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
享元模式将对象分为2个状态:内部状态、外部状态
外部状态意指具体享元角色接受的参数
内部状态指可以共享的元素、我们可以理解成是一个方法、也可以理解成是一个属性

抽象享元角色
public abstract class Flyweight {
    //内部状态
    private String intrinsic;
    //外部状态
    protected final String Extrinsic;

    //要求享元角色必须接受外部状态
    public Flyweight(String _Extrinsic) {
        this.Extrinsic = _Extrinsic;
    }


    //内部状态的getter/setter
    public String getIntrinsic() {
        return intrinsic;
    }

    public void setIntrinsic(String intrinsic) {
        this.intrinsic = intrinsic;
    }

    //定义业务操作
    public abstract void operate();

}
//具体享元角色
public class ConcreteFlyweight extends Flyweight {

    //接受外部状态
    public ConcreteFlyweight(String _Extrinsic) {
        super( _Extrinsic );
    }

    //具体业务逻辑实现
    @Override
    public void operate() {
        System.out.println("ConcreateFlyWeightA");
    }
}
//具体享元角色
public class ConcreteFlyweight1 extends Flyweight {

    //接受外部状态
    public ConcreteFlyweight1(String _Extrinsic) {
        super( _Extrinsic );
    }

    //具体业务逻辑实现
    @Override
    public void operate() {
        System.out.println("ConcreateFlyWeightB ");
    }
}
public class FlyWeightFactory {
    //定义一个池容器
    private static HashMap <String, Flyweight> pool = new HashMap <String, Flyweight>();

    //享元工厂
    public static Flyweight getFlyweight(String Extrinsic) {
        //需要返回的对象
        Flyweight flyweight = null;
        //在池中没有该对象
        if (pool.containsKey( Extrinsic )) {
            flyweight = pool.get( Extrinsic );
            System.out.println("找到了");
        } else {
            //根据外部状态创建享元对象
            flyweight = new ConcreteFlyweight1( Extrinsic );
            //放置到池中
            pool.put( Extrinsic, flyweight );
        }
        return flyweight;
    }
}
public class Test {

    public static void main(String[] args) {
        Flyweight flyweight = FlyWeightFactory.getFlyweight( "1" );
        System.out.println(flyweight);
        flyweight.operate();
        Flyweight flyweight1 = FlyWeightFactory.getFlyweight( "1" );
        flyweight1.operate();
        System.out.println(flyweight1);

    }
}

com.example.design_example.flyweight.ConcreteFlyweight1@3cd1a2f1
ConcreateFlyWeightB 
找到了
ConcreateFlyWeightB 
com.example.design_example.flyweight.ConcreteFlyweight1@3cd1a2f1

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容