1.客户需要做网站,有很多客户,每个需求细节不同,但是主体框架类似,并且如何有很多客户的话,将会照成
大量的资源浪费,所以,把相同的部分进行共享,通过ID的方式来加以区别不同的部分。
2.UML
Flyweight定义了共享的部分,ConcreateFlyweight定义了内部状态,或者说相同的部分。
UnsharedFlyWeight 定义了外部状态,不同的部分。
3.code:
public abstract class WebSite { public abstract void Use(User user);}
package com.jayfulmath.designpattern.flyweight;import java.util.Hashtable;public class WebSiteFactory { private HashtablemTable = new Hashtable<>(); public WebSite getWebSiteCategory(String key) { if(!mTable.contains(key)) { mTable.put(key, new ConcreateWebSite(key)); } return mTable.get(key); } public int getWebsiteCount() { return mTable.size(); }}
package com.jayfulmath.designpattern.flyweight;public class User { String name; public User(String name) { super(); this.name = name; } }
package com.jayfulmath.designpattern.flyweight;public class ConcreateWebSite extends WebSite { String name; public ConcreateWebSite(String name) { super(); this.name = name; } @Override public void Use(User user) { System.out.println("WebSite :"+name+"\t User:"+user.name); }}
package com.jayfulmath.designpattern.flyweight;import com.jayfulmath.designpattern.main.BasicExample;public class FlyweightMain extends BasicExample { @Override public void startDemo() { WebSiteFactory factory = new WebSiteFactory(); WebSite fx = factory.getWebSiteCategory("产品展示"); fx.Use(new User("X")); WebSite fy = factory.getWebSiteCategory("产品展示"); fy.Use(new User("Y")); WebSite fz = factory.getWebSiteCategory("博客"); fz.Use(new User("Z")); }}
当事物可以分为外部状态和内部状态,而且去除外部状态后,内部状态可以归并为多组的时候,可以使用享元模式。
4.享元模式 和原型模式的区别
享元模式 和原型模式都是复制元素或者内容。
但是原型模式 是复用,也就是实例是多份,但是内容相同。
而享元模式是共用,于单例模式相识。