适配器模式之享元模式

    xiaoxiao2026-02-14  23

    设计模式目录 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; } }

    使用场景

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

    最新回复(0)