简介
尝试重用现有的同类对象,未找到匹配的对象,则创建新对象。它提供了减少对象数量从而改善应用所需的对象结构的方式
UML图:
应用场景:
- Java的String类型数据,字符串常量池中存在则并返回,没有则创建字符串并保存在字符串常量池中
- 系统中存在大量相似对象,需要进行池化的时候,如数据库连接池、线程池等
- 需要生成大量的细粒度的实例,且实例大体相似
示例
- 抽象享元对象
public abstract class Website {
public abstract void use(Business business);
}
public class Business {
/**
* 商家名称
*/
private String name;
public Business(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 具体享元对象:
public class ConcretWebsite extends Website{
private String category;
public ConcretWebsite(String category) {
this.category = category;
}
@Override
public void use(Business business) {
System.out.println("网站类型:"+this.category+" 网站名称"+business.getName());
}
}
- 享元工厂
public class WebsiteFactory {
private MapString, Website> websiteMap = new HashMap>();
/**
* 获取网站
*
* @param category
* @return
*/
public Website getWebsite(String category) {
if (websiteMap.containsKey(category)) {
return websiteMap.get(category);
} else {
ConcretWebsite concretWebsite = new ConcretWebsite(category);
websiteMap.put(category, concretWebsite);
return concretWebsite;
}
}
/**
* 获取网站数量
*
* @return
*/
public int getCount() {
return websiteMap.size();
}
}
- 运行
public class Main {
public static void mai服务器托管n(String[] args服务器托管) {
WebsiteFactory websiteFactory = new WebsiteFactory();
Website website = websiteFactory.getWebsite("外卖小程序");
website.use(new Business("蜜雪"));
website.use(new Business("烧仙草"));
Website website1 = websiteFactory.getWebsite("博客");
website1.use(new Business("财经"));
website1.use(new Business("地理"));
System.out.println("网站个数:" + websiteFactory.getCount());
}
}
总结
-
优点
- 可以减少对象的创建,减少程序内存的占用,提高系统性能
-
缺点
- 增加了系统的复杂性
- 必须有一个工厂类加以控制
VS 原型、单例模式
- 原型模式指定创建对象的种类,通过拷贝这些原型创建新对象,本质拷贝一次创建一个新对象
- 单例模式保证一个类仅有一个对象创建
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net