设计模式-结构型-享元模式(Flyweight)

来源:互联网 发布:js urlencode 编辑:程序博客网 时间:2024/04/27 21:03

定义

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

Use sharing to support large numbers of fine-grained objects efficiently

角色

抽象享元角色(Flyweight):产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现

具体享元角色(ConcreteFlyweight):具体产品类,实现抽象享元定义的业务;需要注意的是内部处理应该与环境无关,不应该出现一个操作改变了内部状态,同时修改了外部状态,这是不允许的

不可共享的享元角色(unsharedConcreteFlyweight):不存在外部状态或者安全要求(如线程安全)不能够使用共享技术的对象,该对象一般不会出现在享元工厂中

享元工厂(FlyweightFactory):构造一个池容器,同时提供从池中获得对象的方法

优点

  • 减少应用程序创建的对象
  • 降低程序内存的占用
  • 增强程序的性能

缺点

  • 提高了系统复杂性
  • 需要分离出外部状态和内部状态
  • 外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱

应用场景

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

类图

Flyweight

package com.vapy.structure.flyweght;/** *  * @author vapy 2016年11月9日 * */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;    }}
package com.vapy.structure.flyweght;/** *  * @author vapy 2016年11月9日 * */public class ConcreteFlyweight extends Flyweight {    public ConcreteFlyweight(String _extrinsic) {        super(_extrinsic);    }    @Override    public void operate() {        // 业务逻辑    }}
package com.vapy.structure.flyweght;import java.util.HashMap;/** *  * @author vapy 2016年11月9日 *  */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 ConcreteFlyweight(extrinsic);            pool.put(extrinsic, flyweight);        }        return flyweight;    }}

另外,JDK中也大量使用到了享元模式,举个例子:

package com.vapy.structure.Flyweght;/** *  * @author vapy 2016年11月9日 * */public class FlyweightTest {    public static void main(String[] args) {        String str1 = "a";        String str2 = "b";        String str3 = "ab";        String str4;        str4 = str1 + str2;        System.out.println(str3 == str4);        str4 = (str1 + str2).intern();        System.out.println(str3 == str4);        Integer int1 = 100;        Integer int2 = 100;        Integer int3 = 1000;        Integer int4 = 1000;        System.out.println(int1 == int2);        System.out.println(int3 == int4);    }}

Flyweight_test
本文代码可在github查看:点击此处

1 0
原创粉丝点击