Java设计模式——单件模式
来源:互联网 发布:linux解压bz2文件 编辑:程序博客网 时间:2024/05/21 21:33
概述
有一些对象其实我们只需要一个,比方说:线程池(threadpool)、缓存(cache)、对话框、处理偏好设置和注册表(registry)的对象、日志对象,充当打印机、显卡等设备的驱动程序的对象。事实上,这类对象只能有一个实例,如果制造出多个对象,就会导致许多的问题产生,例如:程序的行为异常、资源使用过量,或者是不一致的结果。——《Head First设计模式》
使用环境
当我们的对象在逻辑上只能有一个的时候,比如说打印机。想像一下,如果我们有两个指向同一台打印机的对象,这时我们应该去响应哪个对象的请求呢?显然我们只能有一个打印机的对象,且这个对象还要互斥地去访问,否则上述问题依旧存在。
优点介绍
1.可以在需要时才开始创建对象
2.保证只有一对象被创建
思路分析
单件模式有两个精髓:
1.一个私有的构造器
2.一个静态的成员变量,用于保存类的对象
如果你没有一个私有的构造器,那么我们完全可以不使用公开的getInstance()方法,而是直接使用类的构造器来实现;如果你没有第一个静态的成员变量来保存对象的对象,你就无法去保证此对象一直存在,这样系统就会在适当的时候回收此对象。
因为上面两点的约束,我们可以得到一个类似这样的公开化的方法:
private static SingletonClass mSingletonClass = null; private SingletonClass() { } public static synchronized SingletonClass getInstance() { if (mSingletonClass == null) { mSingletonClass = new SingletonClass(); } return mSingletonClass; }
上面的代码中使用了关键字synchronized.这是为了在多线程中去互斥地访问临界资源而添加的。
但是你必须知道,同步一个方法可能造成程序执行效率下降100倍。所以在你的程序中,如果 getInstance() 频繁使用,那么就可能需要重新设计你的代码以提高效率了。
双重检查加锁
上面说到 getInstance() 在多线程中的使用可能会有一些不尽如人意的地方。那么要怎么来作一个修改,使得程序更完善呢?利用双重检查加锁可以达到我们的目的。首先检查是否实例已经创建了,如果尚未创建,进行同步。这样的处理,使得程序只会在第一次发生同步,这正是合乎要求的。实现如下:
public static SingletonDoubleChecked getInstance() { if (mDoubleChecked == null) { synchronized (SingletonDoubleChecked.class) { if (mDoubleChecked == null) { mDoubleChecked = new SingletonDoubleChecked(); } } } return mDoubleChecked; }
注意:双重检查加锁不适用于1.4之前的版本。
类图展示
代码展示
SingletonClass.java
public class SingletonClass { private static SingletonClass mSingletonClass = null; private SingletonClass() { } public static synchronized SingletonClass getInstance() { if (mSingletonClass == null) { mSingletonClass = new SingletonClass(); } return mSingletonClass; } public void printLabel() { System.out.println("Singleton Class Label."); }}
SingletonDoubleChecked.java
public class SingletonDoubleChecked { private volatile static SingletonDoubleChecked mDoubleChecked = null; private SingletonDoubleChecked() { } public static SingletonDoubleChecked getInstance() { if (mDoubleChecked == null) { synchronized (SingletonDoubleChecked.class) { if (mDoubleChecked == null) { mDoubleChecked = new SingletonDoubleChecked(); } } } return mDoubleChecked; } public void printLabel() { System.out.println("SingletonDoubleChecked Class Label."); }}
TestMain.java
public class TestMain { public static void main(String[] args) { SingletonClass singletonClass = SingletonClass.getInstance(); singletonClass.printLabel(); SingletonDoubleChecked doubleChecked = SingletonDoubleChecked.getInstance(); doubleChecked.printLabel(); }}
效果图
Github 源码下载
https://github.com/William-Hai/DesignPatternCollections
- Java设计模式——单件模式
- java设计模式——单件模式
- 设计模式——单件模式
- 设计模式——单件模式
- 设计模式——单件模式
- 设计模式——单件模式
- 设计模式—Singleton单件模式
- 设计模式5—单件模式
- JAVA设计模式之单件模式
- 设计模式——单件(单例)模式
- 设计模式-单件
- 【设计模式】单件
- 设计模式---单件
- NET常用设计模式——单件模式
- 设计模式之——单件模式
- 设计模式之——单件模式(Singleton)
- C#设计模式之4——单件模式
- 大话设计模式——单件模式
- mysql 正则
- 折腾 slf4j+log4j 日志
- OC中的非正式协议与正式协议的区别
- MyBatis Generator产生的Example类
- fiddlerScript在无线测试中的应用(模拟网速、修改接口返回数据等)
- Java设计模式——单件模式
- COM组件设计与应用之VC6中用ATL写组件
- SQL数据库——计算列
- TextView的drawableLeft与文本一起居中显示(以及代码设置drawableLeft)
- eclipse中设置文件编辑器
- HTTP 请求方式: GET和POST的比较
- 排序算法大集锦_插入类——直接插入排序
- Java并发编程--多线程之HelloWorld
- IOS开发各类之间的继承关系图