享元设计模式:所谓享元就是会自定义一个hashmap,当你创建对象时,有就直接取,没有就存进去。String 常量池、数据库连接池、缓冲池的的池技术,Integer的valueOf()方法,就是使用了享元模式。
//享元设计模式
public class Flyweight {
public static void main (String[] args) {
WebSiteFactory webSiteFactory = new WebSiteFactory();
WebSite webSite = webSiteFactory.getWebSiteCategory("新闻");
webSite.use(new FlyweightUser("mary"));
WebSite webSite2 = webSiteFactory.getWebSiteCategory("博客");
webSite2.use(new FlyweightUser("tom"));
WebSite webSite3 = webSiteFactory.getWebSiteCategory("博客");
webSite3.use(new FlyweightUser("curry"));
System.out.println("网站的类型有:"+ webSiteFactory.getWebSiteCount()+"种");
}
}
abstract class WebSite {
public abstract void use(FlyweightUser flyweightUser);
}
class ConcreteWebSite extends WebSite {
private String type = "";
public ConcreteWebSite(String type) {
this.type = type;
}
@Override
public void use(FlyweightUser flyweightUser) {
System.out.println("网站的形式是:"+type+" 使用者是:"+ flyweightUser.getName());
}
}
//工厂类,根据需求返回一个网站
class WebSiteFactory {
//集合,充当池的作用
private HashMap<String,ConcreteWebSite> pool = new HashMap<>();
//根据网站类型,返回一个网站,如果没有就创建一个。
public WebSite getWebSiteCategory(String type) {
if (!pool.containsKey(type)) {
pool.put(type, new ConcreteWebSite(type));
}
return pool.get(type);
}
public int getWebSiteCount() {
return pool.size();
}
}
@Data
class FlyweightUser {
private String name;
public FlyweightUser(String name) {
this.name = name;
}
}