设计模式[创建型]之单件模式
从某种意义上来说,单件模式是限制而不是改进类的创建。它可以保证一个类有切且仅有一个实例,并提供一个访问它的全局访问点。像这样的情况在实际程序设计中是常常遇到的。
一般来说,可以通过使用静态方法来创建单件模式:
要让一个类只有一个实例,最容易的方法就是在类中嵌入一个静态变量,并在第一个类实例中设置该变量,而且每次进入构造函数都要进行检查。不管类有多少个实例,静态变量只能有一个实例。同时为了防止类被多次实例化,我们需要把构造函数申明为私有的,这样以后就只能在类的静态方法里创建一个实例,如:
public class kimTest{
private static bool instance=false;
private kimTest(){}
public static kimTest getObject()
{
if(!instance)
return new kimTest();
else
return null;
}
private static bool instance=false;
private kimTest(){}
public static kimTest getObject()
{
if(!instance)
return new kimTest();
else
return null;
}
这个方法的优点在于如果单件已经存在,不需要在考虑异常处理了,因为只不过是从getObject()方法返回了一个空值而已。
kimTest obj=kimTest.getObject();
if(obj!=null)
{
Console.WriteLine(
.)
}
else
{
..}
if(obj!=null)
{
Console.WriteLine(
![](/Images/dot.gif)
}
else
{
![](/Images/dot.gif)
上面的方法有个缺点,需要我们去检查getObject()方法的返回值,以确保它不是空的。这样可以采用一种变通的方法:创建这样一个类,如果试图多次实例化该类,它会抛出一个异常。
public class SingletonException:Exception
{
public SingletonException(string s):base (s)
{}
}
这样除了通过base调用了父类的构造函数外,新的异常类实际上什么也不做。{
public SingletonException(string s):base (s)
{}
}
于是上面的方法可以实现为:
public class kimTest{
static bool instance=false;
public kimTest()
{
if(instance)
throw new SingletonException("only one allowed");
else
instance=true;
}
}
static bool instance=false;
public kimTest()
{
if(instance)
throw new SingletonException("only one allowed");
else
instance=true;
}
}