首页 > 代码库 > 设计模式-单键(Singleton)
设计模式-单键(Singleton)
【摘要】
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
这应该是类设计者的责任,而不是使用都的责任。
【全文】
单键模式(Singleton)
动机
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
这应该是类设计者的责任,而不是使用都的责任。
意图
保证一个类只有一个实例,并提供一个该实例的全局访问点。
实现思路
我们常用的方案是对一个单件对象进行惰性初始化,即仅当第一次使用这个对象时才对这个对象进行初始化。
其实,Singleton模式是设计模式中最简单的一个,因为一个对象的实现化一般是通过new来实现的,而如果我们将构造函数设为私有,那么该对象就不对被“显式”的实例化,然后我们提供一个方法来返回此对象的实例,而在这个方法,我们就大有文章可做了。
C#例子
public class SingeltonSimply
{
private SingeltonSimply()
{
}
private static SingeltonSimply singelton;
public static SingeltonSimply Instance
{
get
{
if (singelton == null)
{
singelton = new SingeltonSimply();
}
return singelton;
}
}}
public class Client
{
public static void Main()
{
SingeltonSimply Instance = SingeltonSimply.Instance;
}
}
Java例子
package pattendesign;
public class Singelton
{
private static Singelton Instance = null;
private Singelton()
{
}
public static synchronized Singelton GetInstance()
{
if(Instance==null)
{Instance = new Singelton();
}
return Instance;
}
}
package pattendesign;
public class Client
{
public Client()
{
}
public static void main(String[] args)
{
Singelton singelton = Singelton.GetInstance();
}
}
备注
1、其实Java与C#的代码实现基本一致,只是java不支持属性,所以用一个方法来获得实例;
2、以上两个例子均无考虑多线程的情况;