单例模式之新的想法

前几天被问到了单例模式对构造函数有什么要求吗?答曰:没什么要求吧?

回来查了下具体的资料才发现,原来单例模式的实现private 的一个构造函数,目的是不让这个单例的类能够new一个对象出来。

思考了下,其实不加应该问题也不大,毕竟如果代码上都是一个人在写的话,其实这种问题还是可以规避的。但是又发现了其他新的一些想法。

先说下以前写的单例吧,其实也很简单,无非就是一个private static然后用getInstance返回,现在感觉想法确实有点幼稚。

上面说的那个private 的构造函数就不提了,个人感觉有当然最好,但是无也未尝不可。

贴一段spring的源码看看spring的sigleton如何写的先

/**
	 * Return the (raw) singleton object registered under the given name.
	 * <p>Checks already instantiated singletons and also allows for an early
	 * reference to a currently created singleton (resolving a circular reference).
	 * @param beanName the name of the bean to look for
	 * @param allowEarlyReference whether early references should be created or not
	 * @return the registered singleton object, or {@code null} if none found
	 */
	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}

singletonObjects 是单例类中存储当前单例对象的一个Map,在获取单例的时候如果能取到则直接返回,如果没有取到则加锁产生一个对象返回。

按照spring的做法,对于配置文件中的类进行注册到singletonObjects 中

代码如下:

/**
	 * Add the given singleton object to the singleton cache of this factory.
	 * <p>To be called for eager registration of singletons.
	 * @param beanName the name of the bean
	 * @param singletonObject the singleton object
	 */
	protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
			this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
			this.singletonFactories.remove(beanName);
			this.earlySingletonObjects.remove(beanName);
			this.registeredSingletons.add(beanName);
		}
	}

然后在使用的时候根据singletonObjects 进行查询并返回对应的对象。

单例模式之新的想法

时间: 2024-10-05 06:19:31

单例模式之新的想法的相关文章

2016-12-1 有新的想法--想要考取ORACLE DBA

现在在做测试,之前学过android开发时接触过一些数据库,没有深入了解过这个领域,而且不知道怎样去考取ORACLE DBA  在此做一个初步的计划: 1.搜索了解考取ORACLE DBA 的流程 2.了解需要学习哪些ORACLE 课程 3.自主学习oracle数据库相关知识 4.报一个正规的ORACLE 培训机构进行系统的学习 5.考取初级的证书 6.深入学习了解ORACLE数据库 7.考取中级证书 8.考取专家级证书

利用CSS3新特性实现完全兼容的自定义滚动条。

背景:最近项目里面因为统一页面风格,用到了自定义滚动条,在完成之前的那个滚动条的时候,与网上各个滚动条插件实现的方法类似,相当于造了轮子,通过css3的 网上看到的滚动条插件多数是通过监听内容的滚动事件,由于原生js的滚动事件存在一些bug,所以实际上用jQuery的mousewheel.js插件的比较多,自己做的滚动条也是引用了该插件. 首先说一说自定义滚动条实现的普遍步骤和方法: 背景: A需要滚动. 1.给A添加一个父级S包裹,并将B进行绝对或相对定位(这点根据S的定位,目的是为了保持原有

程序员如何开始新的工作(转)

英文原文:A Developer's Guide to Starting a New Job 大多数职场新人总是特别焦虑和忐忑不安.刚进入公司,如何把握关于人际关系.工作进度和请教问题等等方面的这个度是非常困难的一件事.更不幸的是,在这个新环境中,还会屋漏偏逢连夜雨地让你处理多任务.在刚开始几天,可能这个信息量会达到不能承受之重. 下面的这些小窍门有助于在你在一周内融入到新公司中. 1. 按时或者稍微提前 千万不要迟到.提前查好路线,预备几个替代线路以防万一.携带联系人的号码以便出现紧急情况时可

新的JavaScript数据结构Streams

最近在网上看到了一个新的 Javascript 小程序——Streams,起初以为是一个普通的 Javascript 类库,但读了关于它的介绍后,我发现,这不是一个简单的类库,而且作者的重点也不是这个类库的功能,而是——借用文中的一段话:如果你愿意花10分钟的时间来阅读这篇文章,你对编程的认识有可能会被完全的改变(除非你有函数式编程的经验!).塔河县臧清机械 还有:Streams 实际上不是一个新的想法.很多的函数式的编程语言都支持这种特征.所谓‘stream’是 Scheme 语言里的叫法,S

【第八周】【新蜂】站会1

组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块 -> 项目名称:java俄罗斯方块NEO 时间:2016.11.13 我们的项目正式更名为 java俄罗斯方块NEO了. 先回顾一下未完成的任务: 1,数据库显示模块. 6,等级窗口模块, 8,版权信息模块. 经过原计划和新的想法,以及收集的用户意见,我们小组讨论,未来2周共计10个工作日的工作是这样的: 总任务: 1,数据库显示模块. 2,等级窗口模块. 3,版权信息模块. 4,新的文字UI. 5

创业股权究竟如何分配--新浪创业训练营

大众创业万众创新,一个好汉三个帮,但是股权怎么分? 股权架构和相关问题,可能是创业里最重要.最基础,但又在初期最不被重视的问题.正是如此,才导致了众多创业项目在未来隐患难除,发展遇阻. 什么样的股权架构是合理的股权架构?一个拥有13年经验的股权法务律师对此有怎样的建议?在新浪创业训练营的股权法务课程中,米律创始人郑明龙分享了股权架构.控制权和激励机制的经验和建议.这是第一部分的内容,关于股权架构. 如果你准备创业,正在创业,或者即将加入某个创业组织,或许对你来说恰逢其会. 以下为郑明龙在新浪创业

虚拟主机与CDN结合,带来的新体验!

php这门语言风靡并且改变了世界.简单,高效,可以快速做出自己的动态网站. 然而他的服务器托管市场,却很传统,没有任何新意. 甚至服务器安装一个cpanel+客户管理系统,半小时内就可以上线一台php托管服务器. 类似恒创,衡天之类的传统php托管服务商,老旧,传统. 财大气粗的万网,美橙等却需要走一趟麻烦的备案流程- 传统的php服务器,一旦遇到『不可抗力』,或者恶意攻击的时候,会导致部署在上面的所有网站全部无法访问,就是宕机. 并且如果想迁移到速度更快的服务器,必须要手动将文件.数据库下载,

关于程序代码量增加后的一点想法

最近在搞去雾方面的程序,发现程序结构慢慢庞大之后(弱弱第一次用C写到1000行),改起来很痛苦. 之前是没有什么计划的,写到哪儿算哪儿,按照论文以及自己的想法来. OpenCV没有处理好多文件编译的问题导致我一直就只能把程序的各个模块放在一个source file里面,看得极其痛苦. 现在有新的想法,各种改着别扭不舒服. 觉得还是自己之前程序的模块化工作做的不好,搞得现在几乎要全部推倒重来的感觉 : ( 星期四要给头儿做报告,我的个god啊~ 想到改程序我就心里闷得慌...

一个不用SD卡,不用livesuit的刷nand的想法

最近看到很多人说livesuit(phoenixsuit)不好用,又不好拿SD卡去刷系统.有了一种新的想法,类似berryboot,但是不一样.先是用ttl线或者安卓的虚拟终端程序去运行一个shell.shell会自动检测网络,然后下载一个很小的启动文件(当然用的是busybox来做rootfs),接着自动dd进nand里面,可能会抹掉u-boot,这个算比较危险的,不过估计会去校验md5.接着启动完这个小系统后,会自动用HDMI和VGA方式来显示图形界面,然后就是类似berryboot但是不一