******************** 模式分类 ****************
从目的来看:
创建型:负责对象的创建结构型:
处理类与对象间的组合行为型:
类与对象交互中的职责分配从范围来看:
类模式处理类与子类的静态关系对象模式处理对象间的动态关系
********************* 单件模式 *********************
动机:必须保证系统中只存在一个对象,确保逻辑的正确性。
意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点。
代码:
单线程模式
using System;
using System.Collections.Generic;
using System.Text;
namespace Singleton
{
class Program
{ static void Main(string[] args)
{ Singleton s = Singleton.Instance; Singleton s1 = Singleton.Instance; Console.WriteLine(object.ReferenceEquals(s,s1)); Console.ReadKey(); }
}
class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{ get { if (instance == null) { instance = new Singleton(); //当用户第一次访问的时候instance为空实例化对象 } return instance; } } } }
要点: Singleton模式中的实例构造器可以设置成protected用来允许子类派生 Singleton模式一般不要支持ICioneable(实例克隆)接口,可能会导致多个对象的实例。 Singleton模式不要支持序列化,可能会导致多个对象的实例。 Singleton不能应对多线程模式,可能会导致多个对象的实例。
************************* 代码:
多线程 using System;
using System.Collections.Generic;
using System.Text;
namespace Singleton
{
class Singleton
{
static Singleton instance=null;
static readonly object padlock = new object();
Singleton() { }
public static Singleton Instance { get { lock (padlock) { if (instance==null) { instance = new Singleton(); } return instance; } } } } }
优点 实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例 灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程 缺点 开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经说过了。 可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。 对象的生存期:Singleton 不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除 对象实例,但这样会导致 Singleton 类中出现悬浮引用。 适用性 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 应用场景 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。 PC机中可能有几个串口,但只能有一个COM1口的实例。 系统中只能有一个窗口管理器。 .NET Remoting中服务器激活对象中的Sigleton对象,确保所有的客户程序的请求都只有一个实例来处理。