一、基本介绍
- 享元模式也叫蝇量模式:运营共享技术有效地支持大量细粒度对象。
- 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重复创建对象。如果没有则创建新的对象。
- 享元模式能够解决重复对象的内存浪费问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。
- 享元模式经典的应用场景就是池技术,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池技术的重要实现方式。
二、展示网站项目需求
1. 项目需求
- 有客户要求以新闻形式发布。
- 有客户要求以博客形式发布。
- 有客户要求以微信公众号形式发布。
2. 类结构
3. 具体实现
- User
public class User {
private String name;
public String getName() {
return name;
}
public User(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
}
- ConcreteWebSite
public class ConcreteWebSite extends WebSite{
private String type = "";
@Override
public void use(User user) {
System.out.println("网站的发布形式为:" + type + " " + user.getName() + "使用中!");
}
public ConcreteWebSite(String type) {
this.type = type;
}
}
- WebSite
public abstract class WebSite {
public abstract void use(User user);
}
- WebSiteFactory
public 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 (WebSite)pool.get(type);
}
public int getWebSiteCount(){
return pool.size();
}
}
- Client
public class Client {
public static void main(String[] args) {
WebSiteFactory factory = new WebSiteFactory();
WebSite webSite1 = factory.getWebSiteCategory("新闻");
webSite1.use(new User("客户1"));
WebSite webSite2 = factory.getWebSiteCategory("博客");
webSite2.use(new User("客户2"));
WebSite webSite3 = factory.getWebSiteCategory("博客");
webSite3.use(new User("客户3"));
WebSite webSite4 = factory.getWebSiteCategory("博客");
webSite4.use(new User("客户4"));
System.out.println("网站的分类共 = " + factory.getWebSiteCount() + "种");
}
}
三、享元模式在JDK源码中的使用
|