设计模式目录
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;
}
}
使用场景
系统中存在大量的相似对象
细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
需要缓冲池的场景
时间: 2024-09-16 04:49:10