享元模式
享元模式是一种结构性模式,他调整了代码的结构
一说到享元模式 那必然会说到池技术 池技术的实现靠的就是享元模式
享元模式又叫蝇量模式 他主要解决了创建过多相同对象的问题
享元模式和单例模式类似 单例模式是类只有一个实例不可以创建多个实例 是在类上做限制 享元模式是可以有多个实例但是实例数量是固定的调用也是只会调用这几个对象 是在对象上做限制
享元模式的创建对象是通过工厂创建的 工厂中有一个数组作为池 记录了池中对象的数量 若想使用对象必须从池中来获取这样就保证了对对象数量的限制
享元模式分为内部状态和外部状态 只有内部状态是放入池中的(也就是共享的) 而且内部状态是不变的
以尚硅谷的网站发布为例
以WebSiteFactory中的hashmap对象作为池 每次获取对象的时候都从map中获取若没有则new对象 若有则直接返回 这样就不会创建重复的对象了
public abstract class WebSite {
public abstract void use();
}
public class ConcreteWebSite extends WebSite {
private String type = "";//网站发布形式
public ConcreteWebSite(String type){
this.type = type;
}
@Override
public void use() {
System.out.println("网站发布形式为" + type);
}
}
import java.util.HashMap;
//网站工厂
public class WebSiteFactory {
//充当池
private HashMap<String,ConcreteWebSite> pool = new HashMap<>();
//根据需要返回网站若没有就创建网站并放入池中
public WebSite getWebSite(String type){
if(!pool.containsKey(type)){
pool.put(type,new ConcreteWebSite(type));
}
return pool.get(type);
}
public int getWebSiteCount(){
return pool.size();
}
}
public class User {
public static void main(String[] args){
//用户在操作的时候若取出相同的对象就不会第二次创建
WebSiteFactory factory = new WebSiteFactory();
WebSite webSite = factory.getWebSite("新闻");
webSite.use();
WebSite webSite1 = factory.getWebSite("博客");
webSite1.use();
WebSite webSite2 = factory.getWebSite("博客");
webSite2.use();
System.out.println(webSite1 == webSite2);
System.out.println(factory.getWebSiteCount());
}
}