定义
享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。
这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
我们Java中的String常量池、数据库连接池、缓冲池等池技术都是享元模式的应用,所以说享元模式是池技术的重要实现方式。
优缺点
优点:
缺点:
- 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态不应该随着内部状态的变化而变化,否则会造成系统的混乱。
结构
- 抽象享元角色: 产品的抽象类。
- 具体享元角色 : 具体的产品类 。
- 不可共享的享元角色: 不会出现在享元工厂中。(非必须)
- 享元工厂 : 构造一个池容器,同时提供从池中获得对象的方法 。
实现
抽象享元角色
public abstract class Site {
public abstract void print();
}
具体享元角色
public class ConcreteSite extends Site {
private String name = "";
public ConcreteSite(String name) {
this.name = name;
}
@Override
public void print() {
System.out.println("值:" + name);
}
}
享元工厂
public class SiteFactory {
private HashMap<String, ConcreteSite> pool = new HashMap<>();
public Site getWebSiteCategory(String key) {
if (!pool.containsKey(key)) {
pool.put(key, new ConcreteSite(key));
}
return (Site) pool.get(key);
}
public int getWebSiteCount() {
return pool.size();
}
}
Main(测试类)
public class Main {
public static void main(String[] args) {
SiteFactory factory = new SiteFactory();
Site site1 = factory.getWebSiteCategory("String");
Site site2 = factory.getWebSiteCategory("String");
Site site3 = factory.getWebSiteCategory("Integer");
Site site4 = factory.getWebSiteCategory("Integer");
Site site5 = factory.getWebSiteCategory("HashMap");
Site site6 = factory.getWebSiteCategory("HashMap");
site1.print();
site2.print();
site3.print();
site4.print();
site5.print();
site6.print();
System.out.println("总数为:" + factory.getWebSiteCount());
}
}
-------结果---------
值:String
值:String
值:Integer
值:Integer
值:HashMap
值:HashMap
总数为:3
|