Singleton模式--个人理解
2011年12月01日
本概念
Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在.再举个例子,集合中的 set 中不能包含重复的元素,添加到set里的对象必须是唯一的,如果重复的值添加到 set,它只接受一个实例.JDK中正式运用了Singleton模式来实现 set 的这一特性,大家可以查看java.util.Collections里的内部静态类SingletonSet的原代码.其实Singleton是最简单但也是应用最广泛的模式之一,在 JDK 中随处可见.
[/b]
[b]简单分析
为了实现 Singleton 模式,我们需要的是一个静态的变量,能够在不创建对象的情况下记忆是否已经产生过实例了.静态变量或静态方法都可以在不产生具体实例的情况下直接调用,这样的变量或方法不会因为类的实例化而有所改变.在图1的结构中可以看到,uniqueInstance 就是这个独立的静态变量,它可以记忆对象是否已经实例化了,在静态方法 Instance 中对这个变量进行判断,若没有实例化过就产生一个新的对象,如果已经实例化了则不再产生新的对象,仍然返回以前产生的实例.
图1: Singleton 模式结构
[/b]
[b]具体实施
实现 Singleton 模式的办法通常有三种.
一. 用静态方法实现 Singleton 这种方法是使用静态方法来监视实例的创建.为了防止创建一个以上的实例,我们最好把构造器声明为 private.
这样可以防止客户程序员通过除由我们提供的方法之外的任意方式来创建一个实例,如果不把构造器声明为private,编译器就会自作聪明的自动同步一个默认的friendly构造器.这种实现方法是最常见的,也就是图1中结构的标准实现.
public class Singleton { private static Singleton s; private Singleton(){}; /** * Class method to access the singleton instance of the class. */ public static Singleton getInstance() { if (s == null) s = new Singleton(); return s; }}// 测试类class singletonTest { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); if (s1==s2) System.out.println("s1 is the same instance with s2"); else System.out.println("s1 is not the same instance with s2"); }}
singletonTest运行结果是:
s1 is the same instance with s2
这证明我们只创建了一个实例.
二. 以静态变量为标志实现 Singleton 在类中嵌入一个静态变量做为标志,每次都在进入构造器的时候进行检查.
问题在于构造器没有返回类型,如果确定创建一个实例成功与否.一个方法是调用一个函数来检查创建是否成功,然后简单的返回一个来自静态变量的值,但是这样做是不优雅的,而且容易发生错误.比较好的做法是创建一个当创建了一个以上的实例时可以抛出异常的类,这个类仅仅是调用父类方法,好处是用了自己命名的异常类型,错误信息更加清晰:
class SingletonException extends RuntimeException { public SingletonException(String s) { super(s); }}class Singleton { static boolean instance_flag = false; // true if 1 instance public Singleton() { if (instance_flag) throw new SingletonException("Only one instance allowed"); else instance_flag = true; // set flag for 1 instance }}// 测试类public class singletonTest { static public void main(String argv[]) { Singleton s1, s2; // create one incetance--this should always work System.out.println("Creating one instance"); try { s1 = new Singleton(); } catch (SingletonException e) { System.out.println(e.getMessage()); } // try to create another spooler --should fail System.out.println("Creating two instance"); try { s2 = new Singleton(); } catch (SingletonException e) { System.out.println(e.getMessage()); }
发表评论
-
Android 目录结构
2012-01-20 12:19 678Android 目录结构 2010年11月08日 In ... -
Linux ARM交叉编译工具链制作过程
2012-01-20 12:19 2378Linux ARM交叉编译工具链制作过程 2010年11月2 ... -
【zz】静态库与动态库搜索路径
2012-01-20 12:19 1204【zz】静态库与动态库 ... -
实现一个最简单的嵌入式操作系统
2012-01-20 12:19 736实现一个最简单的嵌入 ... -
内核级程序开发的特点
2012-01-20 12:19 800内核级程序开发的特点 2010年06月28日 In fa ... -
Python Gossip:简介模组
2012-01-19 17:00 802Python Gossip:简介模组 2010年09月18日 ... -
python sys模块详解!
2012-01-19 17:00 3904python sys模块详解! 2011年06月28日 ... -
C++ 扩展和嵌入 Python
2012-01-19 17:00 851C++ 扩展和嵌入 Python 2011年02月17日 ... -
话说Python:非主流编程语言
2012-01-19 17:00 1008话说Python:非主流编程语言 2010年07月06日 ... -
全能选手 看看Python应乎潮流的72变
2012-01-19 17:00 713全能选手 看看Python应乎潮流的72变 2010年10月 ... -
张志晨VB实例教程之打开word方法种种
2012-01-17 06:45 1053张志晨VB实例教程之打开word方法种种 2011年08月3 ... -
暂时放一放./..脑子要炸了
2012-01-17 06:45 545暂时放一放./..脑子要炸了 2010年11月10日 f ... -
VB制作快捷打开电脑里的应用软件比如:我的电脑 网上邻居 等....
2012-01-17 06:45 592VB制作快捷打开电脑里的应用软件比如:我的电脑 网上邻居 等. ... -
vb代码2
2012-01-17 06:45 582vb代码2 2010年11月21日 ... -
天铭本期热招岗位7.19-7.25
2012-01-17 06:45 3天铭本期热招岗位7.19-7. ... -
世界各国驻中国大使馆名录(全)
2012-01-16 05:35 1144世界各国驻中国大使馆名录(全) 2009年10月07日 ... -
Flex:学习标准(转载)
2012-01-16 05:34 569Flex:学习标准(转载) 2009年12月27日 转载 ... -
藏经阁
2012-01-16 05:34 654藏经阁 2009年07月21日 藏经阁 ... -
FlashBuilder4 (FlexBuilder4)中文版下载
2012-01-16 05:34 1311FlashBuilder4 (FlexBuilder4)中 ...
相关推荐
设计模式-Singleton与Factory
perl-Class-Singleton-1.4-6.el6.noarch.rpm perl-Class-Singleton-1.4-6.el6.noarch.rpm
DataSource的单态模式(SingleTon)程序---马克-to-win java视频 数据源 单态模式 dataSource Singleton
C++完美实现Singleton模式
python库。 资源全名:django-singleton-admin-0.0.2.macosx-10.7-intel.exe
Laravel开发-singleton-pattern 帮助程序包来实现单例类。
用VC实现的singleton 模式 在VS03,VC6.0下编译通过
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
Java的Singleton模式代码(免资源分),你会发现Java的Singleton模式真的很有趣,原来程序还可以这样写。
Singleton模式: 确保一个类只有唯一的一个实例。 Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton...
23种设计模式之三(创建型模式)Singleton模式
NULL 博文链接:https://linxingliang.iteye.com/blog/1217811
- 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合模式(Composite) - 外观模式(Facade) ...
设计模式系列之01-单例模式(Singleton模式),很好的资源,理论实践结合讲述,逐步更新
资源来自pypi官网。 资源全名:dask-actor-singleton-1.1.0.tar.gz
最简单的设计模式学习Singleton模式
java Singleton单例模式 java Singleton单例模式
c++ singleton单例模式