继续打卡设计模式
今天来聊一下享元模式
享元模式 也叫蝇量模式,运用共享技术有效支持大量细粒度的对象
常用于底层系统开发,解决系统的性能问题,像数据库连接池。
一、实际问题
首先提出一个实际的需求
小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网 站,但是要求都有些不同:
- 有客户要求以新闻的形式发布
- 有客户人要求以博客的形式发布
- 有客户希望以微信公众号的形式发布
那么现在解决这个问题我们出发点可能就是说在把原来的东西复制一份然后简单的修改一下。但是大家稍微想想都很清楚里面的很多东西是相似的,也就是说改动量并不是很大,那就是说对于开发者来讲很多东西是可以拿来就用的
那我先这样吧,这个需求是给多个客户定制化开发的我们就先来个User类
/**
* @author: 德鑫
* Description: 用户类
* @Date: 2021/01/22
*/
public class User {
private String name;
public User(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
紧接着我们就来个官网
/**
* @author: 德鑫
* Description:
* @Date: 2021/01/22
*/
public abstract class WebSite {
public abstract void use(User user);
}
那随后写一个定义网站类型的类
/**
* @author: 德鑫
* Description:
* @Date: 2021/01/22
*/
public class ConcreteWebSite extends WebSite {
//共享的部分,内部状态
private String type = ""; //网站发布的形式(类型)
//构造器
public ConcreteWebSite(String type) {
this.type = type;
}
@Override
public void use(User user) {
System.out.println("网站的发布形式为:" + type + " 在使用中 .. 使用者是" + user.getName());
}
}
这个类可以看到继承网站类 有一个共享的状态
现在我们需要有一个工厂类来建造,这个工厂类的主要作用是用来根据建设类型的不同生成不同的网站,为了池化资源。我们利用hashMap的特性来模拟
/**
* @author: 德鑫
* Description: 享元模式
* @Date: 2021/01/22
*/
//网站工厂类,需要返回一个网站
public class WebSiteFactory {
private HashMap<String,ConcreteWebSite> map = new HashMap<>();
public WebSite getWebsiteCategory(String type){
if(!map.containsKey(type)){
//就创建一个网站,并放入到池中
map.put(type, new ConcreteWebSite(type));
}
return (WebSite)map.get(type);
}
public Integer getWebSiteCount(){
return map.size();
}
}
最后写一个客户端测试
public class Client {
public static void main(String[] args) {
WebSiteFactory factory = new WebSiteFactory();
//客户需要以新闻的方式发布网站
WebSite webSite = factory.getWebsiteCategory("新闻");
webSite.use(new User("tom"));
// 客户要一个以博客形式发布的网站
WebSite webSite2 = factory.getWebsiteCategory("博客");
webSite2.use(new User("jack"));
// 客户要一个以博客形式发布的网站
WebSite webSite3 = factory.getWebsiteCategory("博客");
webSite3.use(new User("smith"));
// 客户要一个以博客形式发布的网站
WebSite webSite4 = factory.getWebsiteCategory("博客");
webSite4.use(new User("king"));
//最后获取网站的数量
System.out.println("网站的分类共=" + factory.getWebSiteCount());
}
}
三、享元模式的总结
1、享元模式常用于系统底层开发解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象 中有我们需要的则直接拿来用,避免重新创建
2、享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对 象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率
3、运用共享技术有效地支持大量细粒度的对象