构建模式—单例模式 【转】
引言
很多程序设计都或多或少的涉及设计模式。现在大约有23种设计模式,分类如下:
I] Creational Patterns (构建模式)
- Singleton (单例模式)
- Factory (工厂模式)
- Abstract Factory (抽象工厂)
- Builder (创建模式)
- Prototype(原型模式)
II] Structural Patterns (结构化模式)
- Adapter (适配器模式)
- Bridge (桥模式)
- Composite (复合模式)
- Decorator (装饰模式)
- Facade (门面模式)
- Flyweight (享元模式)
- Proxy(代理模式)
III] Behavioral Pattern (行为模式)
- Chain Of Responsibility (职责链模式)
- Command (命令模式)
- Interpreter (解释器模式)
- Iterator (迭代器模式)
- Mediator (中介者模式)
- Memento (备忘录模式)
- Observer (观察者模式)
- State (状态模式)
- Strategy (策略模式)
- Template Method (模板方法)
- Visitor(访问者模式)
这篇文章讨论单例模式的实现。
概念
设计模式的最显著的优点如下:
◆它们给你提供一个解决已有的并经过项目考验的类似问题的方案。这个解决方案促进复杂关系模块向着最低化耦合发展。它们将系统中可能存在的变化孤立起来,使整个系统更容易理解和维护。
◆设计模式是设计人员间的交流更为有效。软件专业人员可以马上在脑海中勾画出一个高水平的设计方案,并想到以前解决类似问题的设计模式的名称。
单例模式:在单例模式中,对活动的单例类只有一个实例。对单例类的所有实例化得到的都是相同的一个实例。这个模式也提供一个全局的接口来访问这个类的实例。
类图
时序图
实现
以下步骤实现单例模式:
第一步:
创建一个Console Application的项目,命名为SingletonTest。
第二步:
加入一个名为Singleton的类文件,并且加入一下代码:
/// Summary description for Singleton.
/// </summary>
public class Singleton
{
//Fields
private static Singleton instance;
/// <summary>
/// Standard default Constructor
/// </summary>
protected Singleton() {}
/// <summary>
/// Static method for creating the single instance
/// of the Constructor
/// </summary>
/// <returns></returns>
public static Singleton Instance()
{
// initialize if not already done
if( instance == null )
instance = new Singleton();
// return the initialized instance of the Singleton Class
return instance;
}
}
第三步:
创建一个客户端类,来访问这个单例类,如下:
/// Summary description for Client.
/// </summary>
class Client
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
// Constructor is protected -- cannot use new
Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance();
if( s1 == s2 )
Console.WriteLine( "The same instance" );
Console.ReadLine();
}
}
第四步:
执行这个程序得到如下结果:
结论
这样我们用.Net framwork实现了一个单例模式的例子。像所有理论一样,单利模式也有它的优点和缺点。
单例模式的优点:
1,实例控制:单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。
2,伸缩性:因为由类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
单例模式的缺点:
1,系统开销。虽然这个系统开销看起来很小,但是每次引用这个类实例的时候都要进行实例是否存在的检查。这个问题可以通过静态实例来解决。
2,开发混淆。当使用一个单例模式的对象的时候(特别是定义在类库中的),开发人员必须要记住不能使用new关键字来实例化对象。因为开发者看不到在类库中的源代码,所以当他们发现不能实例化一个类的时候会很惊讶。
3,对象生命周期。单例模式没有提出对象的销毁。在提供内存管理的开发语言(比如,基于.NetFramework的语言)中,只有单例模式对象自己才能将对象实例销毁,因为只有它拥有对实例的引用。在各种开发语言中,比如C++,其它类可以销毁对象实例,但是这么做将导致单例类内部的指针指向不明。