浅析软件项目开发中的单件模式(1)
发表于:2007-06-12来源:作者:点击数:
标签:
前言 单件(Singleton)模式作为设计模式的一个典型且相对简单的构造型模式,已经在很多项目的实际 开发 中被广泛采用,由于其所有相关操作都是基于同一个实例的引用,因此单件模式的使用主要出于如下几个目的: 逻辑上仅仅只有一个实例才可以保证逻辑的正确
前言
单件(Singleton)模式作为设计模式的一个典型且相对简单的构造型模式,已经在很多项目的实际开发中被广泛采用,由于其所有相关操作都是基于同一个实例的引用,因此单件模式的使用主要出于如下几个目的:
逻辑上仅仅只有一个实例才可以保证逻辑的正确性。
通过共享减少内存的使用,作为应用中一些集中的统一数据机制存在。
减少因为频繁的构造过程带来应用上的性能损失。
下面是一个最简单的经典单件模式实现方式:
using System;
namespace VisionLogic.DesignPattern.Practice
...{
public class Singleton
...{
private static Singleton instance;
private Singleton() ...{ } public static Singleton Instance
...{
get
...{
if (instance == null)
...{
instance = new Singleton();
instance.data = 0;
}
return instance;
}
} /**//// <summary>
/// 共享的实例数据
/// </summary>
private int data;
public int Data
...{
get ...{ return data; }
set ...{ data = value; }
}
}
}
|
示例1
那么客户端在实际的使用中通过静态的Instance属性就可以获得一个唯一的实例,无论哪一个客户程序对于引用实例的操作都会在其他客户程序中同步更新。
using System;
using System.Diagnostics;
using VisionLogic.DesignPattern.Practice;
namespace VisionLogic.DesignPattern.Practice.Client
...{
class Program
...{
static void Main(string[] args)
...{
Singleton instance1 = Singleton.Instance;
Singleton instance2 = Singleton.Instance; instance1.Data = 30;
Trace.WriteLine(instance2.Data); instance2.Data = 15;
Trace.WriteLine(instance1.Data);
}
}
} 结果:
30
15
|
示例2
单件模式的主要注意事项
上面的例子虽然简单,但实际使用中还需要考虑不要因为面向对象特性和新的开发平台特性,所导致的单件类型性质的变异。
不要实现ICloneable接口或者继承自其相关的子类,否则客户程序可以跳过已经隐蔽起来的类构造函数,导致私有的Singleton() { } 部分的实效。
using System;
namespace VisionLogic.DesignPattern.Practice
...{
public class BaseEntity : ICloneable
...{
public object Clone()
...{
return this.MemberwiseClone();
}
}
public class Singleton : BaseEntity
...{
private static Singleton instance;
private Singleton() ...{ }
public static Singleton Instance
...{
get
...{
if (instance == null)
...{
instance = new Singleton();
instance.data = 0;
}
return instance;
}
}
….
}
}
|