一、为何需要单件模式
-
需求
我们开发了一个大型的项目,其中存在许多的工具类。但是其中很多的工具类我们并不是经常使用得到,甚至
一次都不会使用。但是这些工具类都是静态的类,会消耗很多的内存,即使一次都不使用。这个时候我们需要一种
方式可以解决这个问题。意指只有我们使用到这个工具类的时候才实例化,并且在以后的使用中总是返回首次实例
化的对象而不是重复的实例化新的对象。
-
方案
我们采取的方案是将类默认的构造方法设置为保护类型,这样使用者就无法直接实例化这个类,然后我们在公开一
个静态的方法,用于将本身返回给使用者。其中涉及判断当前的类是否已经被实例化的逻辑代码,如果当前的类已
经被实例化,则直接返回自身。否则实例化自身并保存进一个私有的静态变量中,以便以后使用的时候返回对象。
-
设计
下面是该类的大概轮廓:
public class SingletonPattern
{
private static SingletonPattern _self; protected SingletonPattern()
{
} public static SingletonPattern GetInstance()
{
if (_self == null)
{
_self = new SingletonPattern();
}
return _self;
}
}其中就已经实现了简单的单件模式。
二、模式思想
-
通过将默认的构造方法的访问属性设置为保护类型或者私有类型从而可以阻止用户主动去实例化该类。
相关代码如下:
protected SingletonPattern()
{
} -
通过一个私有的本身类型的变量保存实例化后的本身。
相关代码如下:
private static SingletonPattern _self;
-
公开一个静态的方法用于给用户获取该类的实例。
相关代码如下:
public static SingletonPattern GetInstance()
{
} -
获取实例的方法中通过判断当前是否已经保存了这个类的实例从而决定是否实例化本身。
相关代码如下:
public static SingletonPattern GetInstance()
{
if (_self == null)
{
_self = new SingletonPattern();
}
return _self;
}
三、结束语
单件模式算是23中设计模式中最为简单的,我想这里大家理解的应该也很快速。后面我会陆续介绍所有的23种设计模式以及ASP.NET开发的设计模式。
读过之前的抽象工厂模式的人一定会发觉这篇与前一篇的组织上有很大的差异。因为我也是在学习中,从而不断的积累。自然而然表达的方式会朝着更好更
具体的方向前进,而不是成为代码的搬运工。