首页 > 其他 > 详细

设计模式-单件模式

时间:2015-03-23 00:06:40      阅读:258      评论:0      收藏:0      [点我收藏+]

定义:确保一个类只有一个实例,并提供全局访问节点。

?

public class Singleton {

?

????//定义一个全局的静态对象

????private static Singleton mSingleton = null;

????

????//默认构造方法访问权限设置为Private,不提供外部范围

????private Singleton(){

????????

????}

????

????//定义PublicgetInstance方法,提供唯一的外部访问接口

????public static Singleton getInstance(){

????????if(mSingleton == null)

????????????mSingleton = new Singleton();

????????return mSingleton;

????}

}????

通过以上代码我们就实现了单件模式,是不是非常简单呢?这样就可以让一个类提供唯一的对象。注意,如果你写的单件模式用于多线程中,这样的写法并不安全。那么我们应该怎么写呢?别急,马上为你揭晓。

public class Singleton {

?

????//定义一个全局的静态对象

????private static Singleton mSingleton = null;

????

????//默认构造方法访问权限设置为Private,不提供外部范围

????private Singleton(){

????????

????}

????

????//定义PublicgetInstance方法,提供唯一的外部访问接口

????public static synchronized Singleton getInstance(){

????????if(mSingleton == null)

????????????mSingleton = new Singleton();

????????return mSingleton;

????}

}

仔细观察发现,我们只在getInstance方法中加入了synchronized关键字,这样迫使每一个线程访问此方法之前,要先等候别的线程离开。也就是说不会有两个或以上的线程同时访问这个方法,这个时候同步此方法就变得很累赘,也是不好的设计。还有改进的空间吗?

public class Singleton {

?

????//定义一个全局的静态对象

????private static Singleton mSingleton = new Singleton();

????

????//默认构造方法访问权限设置为Private,不提供外部范围

????private Singleton(){

????????

????}

????

????//定义PublicgetInstance方法,提供唯一的外部访问接口

????public static Singleton getInstance(){

????????return mSingleton;

????}

}

在静态初始化器中创建单件,这段代码保护了线程的安全,不就完美解决问题了吗?如果你不想在静态器中创建单件,那么接下来双重加锁的方法,可以为你提供良好解决办法。

public class Singleton {

?

????// 定义一个全局的静态对象

????private static volatile Singleton mSingleton = new Singleton();

?

????// 默认构造方法访问权限设置为Private,不提供外部范围

????private Singleton() {

?

????}

?

????// 定义PublicgetInstance方法,提供唯一的外部访问接口

????public static Singleton getInstance() {

????????if (mSingleton == null) {

????????????synchronized (Singleton.class) {

????????????????if (mSingleton == null)

????????????????????mSingleton = new Singleton();

????????????}

????????}

????????return mSingleton;

????}

}

设计模式-单件模式

原文:http://www.cnblogs.com/jaden/p/4358430.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!