适配器模式之享元模式

设计模式目录
http://blog.csdn.net/fenglailea/article/details/52733435
风.fox

享元模式 Flyweight Pattern

使用共享对象可有效地支持大量的细粒度的对象

通用类图

享元模式

组成

  • 抽象享元角色 Flyweight
    简单的说就是一个产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
  • 具体享元角色 ConcreteFlyweight
    具体的一个产品类,实现抽象角色定义的业务。该角色中需要注意的是内部状态处理应该与环境无关,不应该出现一个操作改变了内部状态,同事修改了外部状态,这是绝度不允许的
  • 不可共享的享元角色 unshareConcreteFlyweight
    不存在外部状态或者安全要求(如线程安全)不能够使用共享技术的对象,该对象一般不会出现在享元工厂中
  • 享元工厂 FlyweightFactory
    职责非常简单,就是构造一个池容器,同时提供从池中获得对象的方法

通用源码

JAVA

//抽象享元角色
public abstract class Flyweight{
    //内部状态
    private String intrinsic;
    //外部状态
    protected final String Extrinsic;
    //要求享元角色必须接受外部状态
    public Flyweight(String _Extrinsic){
        this.Extrinsic=_Extrinsic;
    }
    //定义业务操作
    public abstract void operate();
    //内部状态的
    public String getIntrinsic(){
        return intrinsic;
    }
    public void setIntrinsic(String intrinsic){
        this.intrinsic=intrinsic;
    }
}
//具体享元角色
public class ConcreteFlyweight1 extends Flyweight{
    //接受外部状态
    public ConcreteFlyweight1(String _Extrinsic){
        super(_Extrinsic);
    }
    //根据外部状态进行逻辑处理
    public void operate(){
        ....
    }
}
public class ConcreteFlyweight2 extends Flyweight{
    //接受外部状态
    public ConcreteFlyweight2(String _Extrinsic){
        super(_Extrinsic);
    }
    //根据外部状态进行逻辑处理
    public void operate(){
        ....
    }
}
//享元工厂
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);
        }else{
            //根据外部状态创建享元对象
            flyweight=new ConcreteFlyweight1(Extrinsic);
            //放到池中
            pool.put(Extrinsic,flyweight);
        }
        return flyweight;
    }
}

使用场景

系统中存在大量的相似对象
细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
需要缓冲池的场景

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页