设计模式之享元模式
先看下定义: 允许使用对象共享来有效地支持大量细粒度对象
提取关键词,共享对象,也就是说这个对象是共享的,那么也就是说是被继承或者实现的。
而一般继承或者实现都是应该有很多共性,所以被抽取出共性。
所以当程序中存在很多共性的地方,只是根据外部调用会有些变化时,那么可以考虑享元模式。
这种模式可以参考连接池,多个连接放在连接池中,如果有需要就从池里面拿,用完了就放回到池里面。
而连接池一般都是先创建好,然后从池里面取,说到先初始化数据,那么就要考虑到工厂模式。
按照连接池方式,那么就创建两个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
总结
凡是对象在多个地方共享,那么就可能是享元模式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?