1. 概念
运用共享技术有效的支持大量细粒度的对象
2. 创建外部状态对象
public class User {
private String name;
public User(String name){
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
3. 创建抽象类对象
public abstract class WebSite {
public abstract void User(User user);
}
4. 创建具体类对象 继承抽象类对象
public class ConcreteWebSite extends WebSite{
private String name;
public ConcreteWebSite(String name){
this.name = name;
}
@Override
public void User(User user) {
System.out.println("网站分类:"+name+" 用户:"+user.getName());
}
}
5. 创建工厂类对象 用于实现对象共享
public class WebSiteFactory {
private Hashtable<String,WebSite> flyWeights = new Hashtable();
/**
* 获得网站分类
* @param key
* @return
*/
public WebSite getWebSiteCategory(String key){
if( !flyWeights.contains(key)){
flyWeights.put(key,new ConcreteWebSite(key));
}
return flyWeights.get(key);
}
public int getWebSiteCount(){
return flyWeights.size();
}
}
6. 测试类
@org.junit.Test
public void test(){
WebSiteFactory factory = new WebSiteFactory();
WebSite site1 = factory.getWebSiteCategory("产品展示");
site1.User(new User("zlc"));
WebSite site2 = factory.getWebSiteCategory("产品展示");
site2.User(new User("cc"));
WebSite site3 = factory.getWebSiteCategory("产品展示");
site3.User(new User("yz"));
WebSite site4 = factory.getWebSiteCategory("博客");
site4.User(new User("zq"));
WebSite site5 = factory.getWebSiteCategory("音乐");
site5.User(new User("yy"));
WebSite site6 = factory.getWebSiteCategory("博客");
site6.User(new User("yjy"));
System.out.println("得到网站的分类总数:"+factory.getWebSiteCount());
}
7.小结
如果一个应用程序使用了大量的对象,而大量的对象造成了很大的存储开销就应该考虑使用,还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式;