概述
定义
使用共享对象可有效地支持大量的细粒度的对象
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查看:点击此处
最后
以上就是重要白云为你收集整理的设计模式-结构型-享元模式(Flyweight)优点缺点应用场景类图的全部内容,希望文章能够帮你解决设计模式-结构型-享元模式(Flyweight)优点缺点应用场景类图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复