您的位置:首页 > 编程语言 > Java开发

Java:设计模式之单例模式(Singleton)

2013-01-13 23:15 260 查看
模式名

单例模式(Singleton)
定义
一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

实例
GPS类全局只有一个GPS,每次调用GPS时,只是返回全局唯一的GPS对象的引用,不会重新创建对象。
适用场景
全局只有一个实例的情况,如硬件资源
结构层次

优点
为了适应特定的实例需求,仅仅允许创建一个对象,保证资源的唯一性。

局限性

单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
package com.freestudio.designpattern;

public class Singleton
{
private static volatile Singleton singleton = null;//全局唯一实例

private Singleton()
{
//禁止直接生产对象
}
// >= JDK 1.5
public static Singleton getInstance()
{
if(singleton==null)
{
synchronized(Singleton.class)
{
if(singleton==null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
public String toString()
{
return "I'm Singleton and have only one instance.";
}
}


package com.freestudio.designpattern;

public class Singleton
{
private final static Singleton singleton = new Singleton();//全局唯一实例

private Singleton()
{
// 禁止直接生产对象
}

public static Singleton getInstance()
{
return singleton;
}

public String toString()
{
return "I'm Singleton and have only one instance.";
}
}
测试代码:

static void TestSingleTon()
{
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.toString());
}


Android实例:

Ringer.java (packages\apps\phone\src\com\android\phone)

public class Ringer {
//...
/** The singleton instance. */
private static Ringer sInstance;
//...
/* package */ static Ringer init(Context context) {
synchronized (Ringer.class) {
if (sInstance == null) {
sInstance = new Ringer(context);
} else {
Log.wtf(LOG_TAG, "init() called multiple times!  sInstance = " + sInstance);
}
return sInstance;
}
}

/** Private constructor; @see init() */
private Ringer(Context context) {
mContext = context;
mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService(Context.POWER_SERVICE));
}
}

Android源代码中搜索singleton能找到很多Singleton的实例。

参考:单例模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: