为方便记忆,我把享元模式理解为:(共)享元(素)模式,核心在于如果对象已存在,则直接返回提供使用,如果不存在则新建,核心代码正如菜鸟教程中所说,代码中有HashMap存放对象。
WebSite中只有一个方法,因此改为接口类,WebSiteFactory中的获得网站分类总数就不写了。
UML
代码结构
public class Client {
public static void main(String[] args) {
WebSiteFactory factory = new WebSiteFactory();
WebSite fx = factory.getWebSiteCategory("产品展示");
fx.use(new User("小菜"));
WebSite fy = factory.getWebSiteCategory("产品展示");
fy.use(new User("大鸟"));
WebSite fz = factory.getWebSiteCategory("产品展示");
fz.use(new User("娇娇"));
WebSite fl = factory.getWebSiteCategory("博客");
fl.use(new User("老顽童"));
WebSite fm = factory.getWebSiteCategory("博客");
fm.use(new User("桃谷六仙"));
WebSite fn = factory.getWebSiteCategory("博客");
fn.use(new User("南海鳄神"));
}
}
public class ConcreteWebSite implements WebSite {
private String name;
public ConcreteWebSite(String name) {
super();
this.name = name;
}
@Override
public void use(User user) {
System.out.println("网站分类:" + name + "用户:" + user.getName());
}
}
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
super();
this.name = name;
}
}
public interface WebSite {
public void use(User user);
}
public class WebSiteFactory {
private Map<String, WebSite> flyweights = new HashMap<>();
//获得网站分类,也是享元模式的核心代码,有就直接提供,没有就新建
public WebSite getWebSiteCategory(String key) {
if(!flyweights.containsKey(key)) {
flyweights.put(key, new ConcreteWebSite(key));
}
return flyweights.get(key);
}
}
运行结果