设计模式-结构型-享元模式(Flyweight)
来源:互联网 发布:js urlencode 编辑:程序博客网 时间:2024/04/27 21:03
定义
使用共享对象可有效地支持大量的细粒度的对象
Use sharing to support large numbers of fine-grained objects efficiently
角色
抽象享元角色(Flyweight):产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
具体享元角色(ConcreteFlyweight):具体产品类,实现抽象享元定义的业务;需要注意的是内部处理应该与环境无关,不应该出现一个操作改变了内部状态,同时修改了外部状态,这是不允许的
不可共享的享元角色(unsharedConcreteFlyweight):不存在外部状态或者安全要求(如线程安全)不能够使用共享技术的对象,该对象一般不会出现在享元工厂中
享元工厂(FlyweightFactory):构造一个池容器,同时提供从池中获得对象的方法
优点
- 减少应用程序创建的对象
- 降低程序内存的占用
- 增强程序的性能
缺点
- 提高了系统复杂性
- 需要分离出外部状态和内部状态
- 外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱
应用场景
- 系统中存在大量的相似对象
- 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
- 需要缓冲池的场景
类图
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); }}
本文代码可在github查看:点击此处
1 0
- 设计模式--享元模式FlyWeight(结构型)
- 结构型设计模式---享元模式(Flyweight)
- 设计模式-结构型-享元模式(Flyweight)
- 结构型模式:Flyweight(享元)
- 享元模式Flyweight(结构型)
- 结构型-享元模式(Flyweight)
- 设计模式--结构型模式之六-Flyweight享元
- 设计模式(11)-结构型-享元模式(Flyweight)
- [设计模式-结构型]享元模式(Flyweight )
- 【设计模式基础】结构型模式 - 6 - 享元(Flyweight)
- 设计模式(结构型)之享元模式(Flyweight Pattern)
- 设计模式(11)--Flyweight(享元模式)--结构型
- 结构型模式-Flyweight ( 享元模式 )
- Java设计模式之结构型模式-享元模式(Flyweight)
- 设计模式:享元模式(Flyweight)
- 设计模式:享元模式(Flyweight)
- 设计模式:享元模式(Flyweight)
- 设计模式-享元模式(Flyweight)
- 还没写完的通讯录,windows版,因为linux里好像不支持清屏的命令。
- 自绘
- c++设计模式之原型模式(prototype)
- Java环境变量配置!
- ubuntu14.04和windows双系统启动顺序的修改
- 设计模式-结构型-享元模式(Flyweight)
- 蓝桥杯 求最大值 dp
- ionic state多页面跳转
- javascript高级面向对象
- nginx 源代码分析 - 启动(一)
- bootstrap row 出现下混动条问题
- UIActivityViewController及其自定义
- SQLite数据库框架ORMLite与GreenDao的简单比较
- hdu1326-简单数学题