Design Pattern: Singleton 模式
一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance)。
很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中;例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个 连接物件,所有其它的程式都透过这个物件来连接资料库,以避免连接物件的重复开启造成资源的耗用;例如系统程式属性档的读取,您使用单一个物件来读取属性 内容,而程式的其它部份都向这个物件要求属性资料,而不是自行读取属性资料。
以印表机设计为例,有的设计人员会采取全域变数的方式来建立实例,并在程式中随机取用这个实例,Java虽然不支援全域变数,但透过将物件包装在一个类别之中,也有人会采用这样的写法:
public class PrintSpooler { public PrintSpooler() { // .... } public Connection getSpooler(){ .... }
} public class GlobalObject { private PrintSpooler printSpooler; public GlobalObject () { printSpooler = new PrintSpooler(); ... } public void getPrintSpooler() { return printSpooler; } }
无论全域变数或是以上的例子,都无法保证只产生唯一个实例,您也许会注意不犯这个错误,但与您共同工作的伙伴也许会直觉的使用建构方法来产生一个 PrintSpooler实例。
Singleton模式可以保证一个类别只有一个实例,并提供一个访问(visit)这个实例的方法。
一个Singleton实作即为Java中的java.lang.Runtime类别,每个Java程式执行时都有一个唯一的Runtime物件,可以透过它提供的静态方法getRuntime()方法来取得这个物件,例如:
Runtime runtime = Runtime.getRuntime();
取得Runtime物件之后,您可以透过它进行一些外部命令的执行、进行垃圾处理等等指令,您可以开启Runtime.java类别,开头的几行是这样写的:
public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; } /** Don't let anyone else instantiate this class */ private Runtime() {} // 以下略
}
有几个实作上面结构的方法,可以在第一次需要实例时再建立物件,也就是采用所谓的Lazy Initialization:
public class Singleton { private static Singleton instance = null; private Singleton() { // .... } public static Singleton getInstance() { if (instance == null) {instance = new Singleton(); }return instance; } // .. 其它实作
}
上面的实作适用于单执行绪的程式,在多执行绪的程式下,以下的写法在多个执行绪的竞争资源下,将仍有可能产生两个以上的实例,例如下面的情况:
Thread1: if(instance == null) // true
Thread2: if(instance == null) // true
Thread1: instance = new Singleton(); // 产生一个实例
Thread2: instance = new Singleton(); // 又产生一个实例
Thread1: return instance; // 回传一个实例
Thread2: return instance; // 又回传一个实例
在多执行绪的环境下,为了避免资源同时竞争而导致如上产生多个实例的情况,加上同步(synchronized)机制
public class Singleton {private static Singleton instance = null;private Singleton(){}synchronized static public Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
不过这种简单的写法不适合用于像伺服器这种服务很多执行绪的程式上,同步机制会造成相当的效能低落,为了顾及Singleton、Lazy Initialization与效能问题,因而有了Double-check Locking的模式:
public class Singleton {private static Singleton instance = null;private Singleton(){}public static Singleton getInstance() {if (instance == null){synchronized(Singleton.class){if(instance == null) {instance = new Singleton();}}}return instance;}
}
Java中Runtime类别的作法就简单多了,它舍弃了Lazy Initialization,如果您的实例初始化不是很久的话,可以用这种方式:
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { // .... } public static Singleton getInstance() { return instance; } // 其它实作
}
Singleton本身的观念简单但应用很广,因而很多时候必须对实际环境作一些考量与调整,建议您也看看有关于Singleton的这篇 讨论。
Design Pattern: Singleton 模式相关推荐
- Design Pattern - Singleton(C#)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Defi ...
- Design pattern : Singleton
Singleton 语义: 在整个应用程序里只能创建唯一一个对象,并且提供全局的访问点: 实现: 1.先看一个经常性的一个错误实现: class Singleton { private: Si ...
- The Singleton of Design Pattern单态模式
1 Singleton Definition 单态模式定义 The main purpose is to gurantee that the instance of class has ...
- Java设计模式 Design Pattern:包装模式 Decorator Pattern
意图 Attach additional responsibilities to an object dynamically. 为一个对象动态的添加职责. Decorators provide a f ...
- Design Pattern: Adapter 模式 - Object Adapter
您的电脑是个旧电脑,新的滑鼠都在使用USB接口了,而您的电脑上并没有USB,而只有一个PS2接口,这时您可以使用一个USB转PS2的接头作为转换,这样您的电脑就可以使用新滑鼠了(当然您也可以使用USB ...
- Thinking In Design Pattern——工厂模式演绎
我始终认为学习设计模式需要怀着一颗敬畏的心去探索,这一系列23种设计模式并不是一蹴而就,都是前人根据自己的经验逐渐演化出来,所以才会形成非常经典的理论.学习设计模式,我想最好的方式是根据自己的经验逐渐 ...
- python singleton design pattern super() 多继承
python singleton design pattern decorate baseclass metaclass import module super() 一.A decorator de ...
- Thinking In Design Pattern——Unit Of Work(工作单元)模式探索
阅读目录 什么是Unit Of Work模式 建立Infrastructure 建立Model 建立Repository来持久化业务实体 回到顶部 什么是Unit Of Work模式 Unit Of ...
- Head First Design Pattern 读书笔记(4) 工厂模式
2019独角兽企业重金招聘Python工程师标准>>> Head First Design Pattern 读书笔记(4) Factory Pattern 工厂模式 ##Factor ...
最新文章
- 来看看BAT在AR领域的布局,你给打几分?
- 1.7 Character类
- CentOS 7/8 安装 oniguruma 和 oniguruma-devel
- CentOS 8 正式发布
- 12个关键词,告诉你到底什么是机器学习
- 微服务治理框架的选择:对比Spring Cloud和Istio
- 安卓学习随笔 -- 自定义标题栏
- python画正方形的代码drawingpanel_wxpython编程之 画板(一个不错的研究的完整示例)...
- [ssh] remote host key has changed
- 基于SOC方案的嵌入式开发-远程定时设备
- IIS------无法打开登录所请求的数据库 company。登录失败。 用户 'IIS APPPOOL\AppPool 4.0' 登录失败。...
- struts2 从一个action 跳转到另一个action的两种方法
- 多人操作sqlite3数据库冲突问题解决方法
- 代码雨大全(装逼或学习)--KuaiLe推荐
- Android-MTK系统- 系统常用修改点
- 荐书丨10 本豆瓣高分技术图书,强烈推荐!
- 【代码质量】嵌入式编程节约内存技巧
- error An unexpected error occurred: “https://registry.npmjs.org/axios
- css文字长度实现宽度自适应、显示三行超出省略号
- SessionFactory的用法