一、享元模式的概念
享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象,最大可能的实现对象复用。
享元工厂[FlyweightFactory]:用于创建具体享元类,维护相同的享元对象。当请求对象已经存在时,直接返回对象,不存在时,新建对象。
抽象享元[Flyweight]:定义需要共享的对象业务接口。
共享子类[ConcreteFlyweight]:实现抽象享元类的接口,包含具体逻辑,对外共享。
非共享子类[UnsharedConcreteFlyweight]:实现抽象享元类的接口,包含具体逻辑,不对外共享。
二、享元模式的实现
//抽象享元
public interface WebSite{
public abstract void use();
}
//共享子类
puublic class ConcreteWebSite implements WebSite{
private String name;
public ConcreteWebSite(String name){
this.name = name;
}
public void use(){
System.out.println("The current site is " + name);
}
}
//享元工厂
public class WebSiteFactory{
private HashMap<String,WebSite> pool = new HashMap<>();
public WebSite getWebSite(String name){
if(!pool.containsKey(name)){
pool.put(name,new ConcreteWebSite(name));
}
return pool.get(name);
}
public int getFactorySize(){
return pool.size();
}
}
public class Test{
public static void main(String[] args){
WebSiteFactory factory = new WebSiteFactory();
WebSite csdn = factory.getWebSite("csdn");
csdn.use();
WebSite blog = factory.getWebSite("blog");
blog.use();
WebSite csdn = factory.getWebSite("csdn");
csdn.use();
WebSite blog = factory.getWebSite("blog");
blog.use();
System.out.println(factory.size());
}
}
三、享元模式的应用
- 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
- 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
具体应用:String字符串、棋类游戏开发中等...
四、享元の其他问题
- 减少了对象的创建,降低了程序内存的占用,提高效率
- 提高了系统的复杂度,需要分离出内部状态和外部状态
内部状态和外部状态
五、Reference
六、Resource