博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

单件模式

Posted on 2008-11-26 15:33  yuanws  阅读(171)  评论(0编辑  收藏  举报

单件模式(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; }
}
}
}

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

 

 

不要实现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;
}
}
….
}
}

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)instance1.Clone();
instance1.Data = 30;
Trace.WriteLine(instance2.Data);
instance2.Data = 15;
Trace.WriteLine(instance1.Data);
}
}
}
结果:
0
30