读秦小波《设计模式之禅》 -- 单例模式
新年第一天,在这里首先要祝大家新年快乐!
这篇文章中,介绍的是非常重要,也是非常常用的一种设计模式 -- 单例模式。例如,我们在电脑上登录QQ的时候,同一个QQ号码就只能登录一次,而不可能出现一个号码可以登录两次的情况;再好像我现在听歌用的播放器,我也只能打开它一次,当它在运行的时候,我不能够同时运行两个播放器客户端。。。等等的这些模式都是单例的,即它能保证一个类就只有一个实例对象。
这里运用书中的例子去解释构造单例的方法。
一个国家需要有一个皇帝,并且这个皇帝就只能有一个,那么,很显然,它是单例的。我们需要构造一个皇帝类,且这个皇帝类只能有一个实例对象,那么,这里就会出现一个限制,即这个类的构造方法需要是私有的(private),否则,我们可以任意的生成对象。且这个类需要有一个静态方法(static),当我们需要这个类的对象时,就可以利用这个方法去获取类对象。
好吧,看下具体的实现吧:
public class __Q_Y_Emperor {/*这样设计可以保证它是线程安全的*/private static __Q_Y_Emperor _Emperor = new __Q_Y_Emperor();private __Q_Y_Emperor(){}public static __Q_Y_Emperor __Q_Y_GetInstance(){return _Emperor;}public static void __Q_Y_Talk(){System.out.println("i am Qinyi Zhang...");}
}
这个类的实现就是利用到单例模式,当然,这里只是单例模式的一种实现方式。
我们需要一个测试函数,测试下这个单例模式是否好用,这里,场景是有几个大臣找皇帝,然后,每一个大臣找到的都是同一个皇帝。
public class __Q_Y_EmperorMain {/*** @param args*/@SuppressWarnings("static-access")public static void main(String[] args) {// TODO Auto-generated method stubint _Minister = 5;for (int i = 0; i != _Minister; ++i){/*获取的实例对象都是同一个*/__Q_Y_Emperor _Emperor = __Q_Y_Emperor.__Q_Y_GetInstance();_Emperor.__Q_Y_Talk();}}}
我们运行下这个主函数,得到如下的结果:
i am Qinyi Zhang...
i am Qinyi Zhang...
i am Qinyi Zhang...
i am Qinyi Zhang...
i am Qinyi Zhang...
下面,看下类图是怎样的,很简单,没有继承关系之类的
书中从单例模式又引申出了一个叫 “多例模式” 的设计方法,即一个类能产生多个对象,但是对象的个数是有限制的。
也同样是皇帝的例子,只是这个例子中出现了多个皇帝,每个大臣可能找到的是不同的皇帝。
好吧,这个也是很容易实现的:
public class __Q_Y_MultiEmperor {private final static int _MaxNumOfEmperor = 3;private static ArrayList<String> _EmperorName = new ArrayList<String>();private static ArrayList<__Q_Y_MultiEmperor> _EmperorList = new ArrayList<>();private static int _CurrentNumOfEmperor = 0;private __Q_Y_MultiEmperor(){}private __Q_Y_MultiEmperor(String _name){_EmperorName.add(_name);}static{/*多例模式,对象个数是有限制的*/for (int i = 0; i != _MaxNumOfEmperor; ++i){_EmperorList.add(new __Q_Y_MultiEmperor("num " + (i + 1)));}}public static __Q_Y_MultiEmperor __Q_Y_GetInstance(){Random _randrom = new Random();_CurrentNumOfEmperor = _randrom.nextInt(_MaxNumOfEmperor);return _EmperorList.get(_CurrentNumOfEmperor);}public static void __Q_Y_Talk(){System.out.println(_EmperorName.get(_CurrentNumOfEmperor));}
}
测试函数:
public class __Q_Y_MultiMain {/*** @param args*/@SuppressWarnings("static-access")public static void main(String[] args) {// TODO Auto-generated method stubint _Minister = 10;for (int i = 0; i != _Minister; ++i){__Q_Y_MultiEmperor _Emperor = __Q_Y_MultiEmperor.__Q_Y_GetInstance();_Emperor.__Q_Y_Talk();}}}
类图:
最后,运行下这个例子吧:
num 3
num 2
num 2
num 2
num 3
num 1
num 2
num 2
num 1
num 1
读秦小波《设计模式之禅》 -- 单例模式相关推荐
- 读秦小波《设计模式之禅》 -- 工厂模式
设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都 ...
- 读-秦小波-编写高质量代码:改善java程序的151个建议
有些建议不太用到,但是用到的时候如果不注意就会进坑,所以书名改成java的151个坑更合适. 不要在常量和变量中出现易混淆的字母 包名全小写,类名首字母全大写,常量全大写下划线分割,变量驼峰: 字母l ...
- 荣幸成为了设计模式之禅的试读员--致谢秦小波老师
今天闲逛 发现荣幸成为了 设计模式之禅的试读员. 本就是凑个热闹,上帝垂青,幸福降临 高兴之余 倍感责任 上对作者下对读者中对良心 但愿也能 铁肩担道义 妙手著文章 了 做程序员这么久 GOF却不敢说 ...
- 故事的魅力—读王小波的《绿毛水怪》
文章目录 一.引言 二.写于阅读前 赠书及理由 我阅读的初心 三.写于阅读后 故事的魔力 一.引言 和朋友一起在书店看书,朋友送了一本书.于是把阅读前后的感受和心境记录下来. 二.写于阅读前 赠书及理 ...
- 正在读王小波的《沉默的大多数》感觉不错的话就贴出来
人是一种会自己骗自己的动物.我们吃了很多无益的苦,虚掷了不少年华,所以有人就想说,这种经历是崇高的. ---王小波<沉默的大多数> 转载于:https://blog.51cto.com/s ...
- 最近在读王小波的作品
喜欢这几句: 参差多态乃幸福之源.(罗素的话,但是在王小波的作品中看到) 有趣才是最重要的,无趣的东西不值得追求. 人应该是平等的,但是每个人大脑里的智慧不同,所以绝对平等是不可能的.
- 读王小波《黄金时代》有感
在手机阅读器上看的书,今天打开,发现已经下架了!?? 一开始看不明白在说什么,似乎明白在说很精神的东西,有点儿类似<追忆似水年华>,但是又讲不清楚在说什么.在网上看了解读后,稍微理解了一点 ...
- 初读《设计模式之禅》
读这本书的起因源于csdn学生大本营的一次活动<设计模式之禅>试读员招募,身为程序员兼之学生大本营的老师没有道理不踊跃参加了(参加时可没走任何后门),佛祖显灵,真的能有幸成为了试读员.从得 ...
- 设计模式之禅之单例模式
声明:本文为阅读秦小波所写的<设计模式之禅>所写小结,文章内容可能有部分引述此书. 单例模式(Singleton Pattern) 1.定义: 确保某个类只有一个实例,自行实例化并向 ...
最新文章
- 计算机控制里ddc什么缩略语,空调自动化术语和缩略语.doc
- MySQL图形处理软件Navicat字体配置(乱码解决)
- 功能性平台创新-农业大健康·杨建国:谋定都江堰精华灌区
- 《和平饭店》藏玄机,如何做用户行为分析专家?
- boost::gil::color_spaces_are_compatible用法的测试程序
- xp 设备管理器 android,XP设备管理器怎么打开?
- 关于有序二维矩阵查找和字符串替换的两道算法题
- 理论基础 —— 索引 —— 倒排索引
- 物流设计大赛优秀作品_喜报 | 物流设计大赛商院学子获佳绩,实现该项竞赛零的突破...
- 一文教你如何深入机器学习,从编程基础到完整的项目实战
- MyBatis入门到精通,最全最详细的MyBatis学习教程来了
- 自己开发的小程序如何跳转到京东拼多多小程序产品页面
- 一键Pad变电脑,安全快速的远控办公这不就来了。
- 【元胞自动机】基于元胞自动机之地铁火灾疏散模型matlab源码
- 1564 区间的价值
- Linux设置自动关机
- 约瑟夫问题(小小算法,真不可笑)
- 关于LR和PS显示颜色和到处颜色不同的处理办法
- Application.DoEvents();
- 少儿编程scrach(源码和课程)