定义:运用共享技术有效地支持大量细粒度的对象。
Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。为了调用方便,FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。 Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况成立时使用Flyweight模式: 结构图: |
public interface WebSite {
void Use(User user);
}
public class WebSiteFactory {
private HashMap<String,WebSite> f = new HashMap<String,WebSite>();
public WebSite getWebSiteCategory(String key){
if (!f.containsKey(key)) {
f.put(key, new ConcreteWebSite(key));
}
return f.get(key);
}
public int GetCount(){
return f.size();
}
}
public class User {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
}
public class ConcreteWebSite implements WebSite {
private String name;
public ConcreteWebSite(String name) {
this.name = name;
}
@Override
public void Use(User user) {
System.out.println("用户 "+user +" 网站分类 "+name);
}
}
public class Client {
public static void main(String[] args) {
WebSiteFactory wf = new WebSiteFactory();
WebSite f1 = wf.getWebSiteCategory("goods show");
f1.Use(new User("a"));
WebSite f2 = wf.getWebSiteCategory("goods show");
f2.Use(new User("b"));
WebSite f3 = wf.getWebSiteCategory("blog");
f3.Use(new User("c"));
int count = wf.GetCount();
System.out.println(count);
}
}
优缺点:
1)享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
2)享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。