设计模式和原则索引
using System;
///
/// Singleton模式,对象只能有一个实例,且实例由对象自身创建,外部无法实例化单例对象
/// 适用于某个对象在系统中致应该有一个实例的情况(可以控制执行的顺序)
///
/// 为什么是Singleton 而不是静态类,Singleton是实例行为,可以实现实例级别上的行为(如继承)
/// 而不只是静态函数的集合,而且实例化可以有逻辑上的处理
///
/// 下例:
/// OrderService负责处理Order相关的处理,并为Client提供OrderId,以保证每个订单都有唯一的ID
///
namespace fofo.DesignPattern
{
public class OrderService
{
private static OrderService _instance = null;
// 也可以使用此方式创建单例,DotNet保证对象只被创建一次,
// readonly关键字保证实例不会被更改。
// 但这样会破坏多态,不需要继承的情况下使用,可以减少排他的消耗
//private static readonly OrderService _instance = new OrderService();
private int _orderSequence;
// 私有构造函数,确保外部不能创建
private OrderService()
{
_orderSequence = 0;
}
public static OrderService GetService()
{
if (_instance == null)
{
using (System.Threading.Mutex mutex = new System.Threading.Mutex())
{
mutex.WaitOne();
if (_instance == null)
{
_instance = new OrderService();
}
}
}
return _instance;
}
public int CreateOrderId()
{
System.Threading.Interlocked.Increment(ref _orderSequence);
return _orderSequence;
}
public string Invoke()
{
// do something
return "order service invoke";
}
}
public class Singleton
{
public static void Main()
{
var service = OrderService.GetService();
int nOrderId = service.CreateOrderId();
string orderFile = System.IO.Path.Combine("OrderData", string.Format("Order{0}.txt", nOrderId));
System.IO.File.WriteAllText(orderFile, service.Invoke(), System.Text.Encoding.UTF8);
}
}
}