设计模式

享元模式

2019-09-23  本文已影响0人  TZX_0710

享元模式(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

上一篇 下一篇

猜你喜欢

热点阅读