设计模式之享元模式
先看下定义: 允许使用对象共享来有效地支持大量细粒度对象
提取关键词,共享对象,也就是说这个对象是共享的,那么也就是说是被继承或者实现的。
而一般继承或者实现都是应该有很多共性,所以被抽取出共性。
所以当程序中存在很多共性的地方,只是根据外部调用会有些变化时,那么可以考虑享元模式。
这种模式可以参考连接池,多个连接放在连接池中,如果有需要就从池里面拿,用完了就放回到池里面。
而连接池一般都是先创建好,然后从池里面取,说到先初始化数据,那么就要考虑到工厂模式。
按照连接池方式,那么就创建两个Dao。
用工厂方式初始化,里面的Map是享元模式的精髓,共享的地方。
/**
* @author lw
* @date 2022/3/30 0030
* @description
*/
public class SmsDaoFactory {
private static Map<String,SmsDao> daoMap = new HashMap<>();
public static SmsDao produce(String type){
if(daoMap.size()==0){
initDao();
}
return daoMap.get(type);
}
/**
* 初始化
*/
private static void initDao(){
SmsDao yidong = new YiDongSmsDao();
yidong.connect();
daoMap.put("yidong",yidong);
SmsDao liantong = new LianTongSmsDao();
liantong.connect();
daoMap.put("liantong",liantong);
}
}
调用者
/**
* @author lw
* @date 2022/3/29 0029
* @description 短信服务
*/
public class SmsService {
public void send() {
SmsDao smsDao = SmsDaoFactory.produce("yidong");
smsDao.insertSms();
}
}
SmsService smsService = new SmsService();
smsService.send();
smsService.send();
smsService.send();
smsService.send();
//运行后输出
YiDongSmsDao.connect
LianTongSmsDao.connect
YiDongSmsDao.insertSms
YiDongSmsDao.insertSms
YiDongSmsDao.insertSms
YiDongSmsDao.insertSms
总结
凡是对象在多个地方共享,那么就可能是享元模式。