读秦小波《设计模式之禅》 -- 单例模式

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

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

		int _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 stub

		int _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
时间: 2024-12-26 07:16:51

读秦小波《设计模式之禅》 -- 单例模式的相关文章

读秦小波老师《设计模式之禅》问一-依赖倒置原则

这本<设计模式之禅>得来不易,当时是在CSDN的论坛中向秦小波老师提问有幸获得的.读这种经典书籍不能如读小说,逛十里洋场意在消遣,更多的应该是边读变问,每到重点就应该问为什么.秦小波老师的语言有时幽默,有时又切中要害,引人深思.对于"倒置"秦小波老师是从人的思维层面解读的,生活中,例如张三就依赖他家的宝马上下班,也许可以更具体到BMW 740Li,然后回归到程序中,如果我们这样去构建依赖关系,那么如果哪天张三发达了,换了玛莎拉蒂,那是不是整个程序都得改,这个时候我们可以让张

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

设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都配以适当的例子,非常适合学习设计模式的初学者,当然,程杰的<大话设计模式>也是非常好的一本书,都可以拿过来当做一本工具书随时查看理解设计的奥妙. 工厂模式 这个模式的名字就已经告诉了我们它想要做什么,就是让我们构造出一个工厂,然后生产我们需要的东西,即生成对象.那么,为什么要构造一个工厂呢,为什么

设计模式之禅-单例模式

个人blog 此篇博文地址:http://www.sanyinchenblog.com/?p=233 单例模式: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. demo(https://github.com/sanyinchen/UMLDemo) 通用视图(饿汉式): 单例通用代码模板: public class Singleton{ private static final Singleton singleton=new Singleton(); private Singl

设计模式之禅之单例模式

转载:http://www.javaweb1024.com/java/Javajichu/2015/04/09/535.html 设计模式之禅 第一第二版下载地址 http://www.javaweb1024.com/info/403.jspx 第7章 单例模式 7.1 我是皇帝我独苗 自从秦始皇确立了皇帝这个位置以后,同一时期基本上就只有一个人孤零零地坐在这个位置.这种情况下臣民们也好处理,大家叩拜.谈论的时候只要提及皇帝,每个人都知道指的是谁,而不用在皇帝前面加上特定的称呼,如张皇帝.李皇帝

读《我的精神家园-王小波》摘抄与感想

??最近读了王小波的<我的精神家园>,这本书算是杂文类的,比起那种长篇大论的小说阅读起来轻松多了,读完感觉是,王小波很多观点很犀利,独特,粗鄙又不乏幽默.难怪高晓松对王小波有着极高的评价,说他是现代白话文写作第一名,且甩掉第二名好几个身位(大概就这意思),读完本书,把自己觉的写得好的地方加以摘抄,顺便有感而发写点文字记录一下. 备注 部分段落末尾破折号后的文字表示所属书中具体文章标题 括号里的内容仅代表个人观点 1.人们的见识总要受到处境的限制,这种限制既不知不觉,有劳不可破.-有关天圆地方

读《架构师于小波:魅族实时消息推送架构》总结

原文网址:http://www.csdn.net/article/2015-12-22/2826542 1.系统架构设计.系统架构逻辑上划分,划分为四层,最下面的一个是提供魅族手机的接入.第二层是消息分发服务,主要的作用就是提供上行消息的路由和用户下行消息的路,这边有一个用户路由表.第三层是订阅信息,第四层是存储,包括离岸消息存储,包括订阅消息的存储. 2.手机功耗问题主要涉及两个点,第一个是流量,第二个是电量.先看流量的问题,怎么样解决流量的问题,通过协议选择,现在传统的互联网上,有比较典型的

白银时代-王小波

白银时代-王小波"生活"是天籁,必须凝神静听.对不相信的事情说不在意,这就是我保全体面的方法.在剧痛中死在沙漠里,也比迷失在白银世界里要好得多.文明社会一环扣一环,和谐地运转着,错一环则动全身.你知道什么是天才的秘诀吗?那就是永远只做一件事.假如要做的事情很多,那就排出次序,依次来干.每个人的一生都拥有一些资源,比方说:寿命,智力,健康,身体,性生活.有些人准备把它消费掉,换取新奇,快乐等等.女人上街总是想猎人扛枪进山一样,但是猎取的目标有所不同.他说,我这一生都在等待,等待研究数学,

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

《Java设计模式》之单例模式

在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下. 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 1. 最简单的实现 首先,能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者.这样,