新年第一天,在这里首先要祝大家新年快乐!

这篇文章中,介绍的是非常重要,也是非常常用的一种设计模式 -- 单例模式。例如,我们在电脑上登录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

读秦小波《设计模式之禅》 -- 单例模式相关推荐

  1. 读秦小波《设计模式之禅》 -- 工厂模式

    设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都 ...

  2. 读-秦小波-编写高质量代码:改善java程序的151个建议

    有些建议不太用到,但是用到的时候如果不注意就会进坑,所以书名改成java的151个坑更合适. 不要在常量和变量中出现易混淆的字母 包名全小写,类名首字母全大写,常量全大写下划线分割,变量驼峰: 字母l ...

  3. 荣幸成为了设计模式之禅的试读员--致谢秦小波老师

    今天闲逛 发现荣幸成为了 设计模式之禅的试读员. 本就是凑个热闹,上帝垂青,幸福降临 高兴之余 倍感责任 上对作者下对读者中对良心 但愿也能 铁肩担道义 妙手著文章 了 做程序员这么久 GOF却不敢说 ...

  4. 故事的魅力—读王小波的《绿毛水怪》

    文章目录 一.引言 二.写于阅读前 赠书及理由 我阅读的初心 三.写于阅读后 故事的魔力 一.引言 和朋友一起在书店看书,朋友送了一本书.于是把阅读前后的感受和心境记录下来. 二.写于阅读前 赠书及理 ...

  5. 正在读王小波的《沉默的大多数》感觉不错的话就贴出来

    人是一种会自己骗自己的动物.我们吃了很多无益的苦,虚掷了不少年华,所以有人就想说,这种经历是崇高的. ---王小波<沉默的大多数> 转载于:https://blog.51cto.com/s ...

  6. 最近在读王小波的作品

    喜欢这几句: 参差多态乃幸福之源.(罗素的话,但是在王小波的作品中看到) 有趣才是最重要的,无趣的东西不值得追求. 人应该是平等的,但是每个人大脑里的智慧不同,所以绝对平等是不可能的.

  7. 读王小波《黄金时代》有感

    在手机阅读器上看的书,今天打开,发现已经下架了!?? 一开始看不明白在说什么,似乎明白在说很精神的东西,有点儿类似<追忆似水年华>,但是又讲不清楚在说什么.在网上看了解读后,稍微理解了一点 ...

  8. 初读《设计模式之禅》

    读这本书的起因源于csdn学生大本营的一次活动<设计模式之禅>试读员招募,身为程序员兼之学生大本营的老师没有道理不踊跃参加了(参加时可没走任何后门),佛祖显灵,真的能有幸成为了试读员.从得 ...

  9. 设计模式之禅之单例模式

    声明:本文为阅读秦小波所写的<设计模式之禅>所写小结,文章内容可能有部分引述此书. 单例模式(Singleton Pattern) 1.定义:    确保某个类只有一个实例,自行实例化并向 ...

最新文章

  1. 计算机控制里ddc什么缩略语,空调自动化术语和缩略语.doc
  2. MySQL图形处理软件Navicat字体配置(乱码解决)
  3. 功能性平台创新-农业大健康·杨建国:谋定都江堰精华灌区
  4. 《和平饭店》藏玄机,如何做用户行为分析专家?
  5. boost::gil::color_spaces_are_compatible用法的测试程序
  6. xp 设备管理器 android,XP设备管理器怎么打开?
  7. 关于有序二维矩阵查找和字符串替换的两道算法题
  8. 理论基础 —— 索引 —— 倒排索引
  9. 物流设计大赛优秀作品_喜报 | 物流设计大赛商院学子获佳绩,实现该项竞赛零的突破...
  10. 一文教你如何深入机器学习,从编程基础到完整的项目实战
  11. MyBatis入门到精通,最全最详细的MyBatis学习教程来了
  12. 自己开发的小程序如何跳转到京东拼多多小程序产品页面
  13. 一键Pad变电脑,安全快速的远控办公这不就来了。
  14. 【元胞自动机】基于元胞自动机之地铁火灾疏散模型matlab源码
  15. 1564 区间的价值
  16. Linux设置自动关机
  17. 约瑟夫问题(小小算法,真不可笑)
  18. 关于LR和PS显示颜色和到处颜色不同的处理办法
  19. Application.DoEvents();
  20. 少儿编程scrach(源码和课程)

热门文章

  1. 史上第二走心的 iOS11 Drag Drop 教程
  2. Google机器人眼里的百度
  3. js实现响应式瀑布流
  4. tensorflow中的placeholder()
  5. 【逆向】UE4 渲染流程分析
  6. nginx视频直播/点播服务干货分享
  7. 多态 oc c++ 与oc category
  8. 打印给定字符串中字符的所有排列
  9. linux sshd cpu 过高 问题解决
  10. python 列表list 合并的方法