程序设计模式-创建模式-单例模式
意图:保证一个类仅有一个实例或只有指定个数的实例(实例池),并提供一个访问它的全局访问点。
主要解决:保证实例的单一性
适用于:1当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 2当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
场景:定义一个SingtanceClass类 。在程序中只能实例化一次。
思路:
第一步、为了确保实例的唯一性,我们第一步就是要在类的定义中私有化一个静态自己。
第二步、我们都知道类的构造方法不写时,系统会自动给我们生成一个public的无参构造方法,所以为了避免new出多个对象,我们必须将构造函数手写,设置为private私有类型
第三步、我们再给外界提供一个公共静态方法作为此类的唯一全局访问点。在此方法中if判断,如果此实例为空,则调用构造方法初始化,如果不为空,则直接返回此实例。
第四步、线程安全是在多线程程序中必须考虑的我们可以定义一个object 的线程锁标记。用来确保多个线程不会同时创建出多个此类
定义代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 创建模式_1.单例模式 { public class SingletonClass //public { private static SingletonClass sc;//私有化这个唯一实例对象 private static readonly object locker = new object(); // 定义一个标识确保线程同步,非多线程可无 private SingletonClass()//私有化构造方法,使其无法通过new实例化出。 如果不写,默认系统会自动给我们创建public的构造方法,这样就可以通过new实例化出来。 { } //定义一个公共方法,用来做该实例的唯一全局访问点 public static SingletonClass GetInstance() { lock (locker)//非多线程可无 { if (sc == null) // 如果类的实例不存在则创建,否则直接返回 { sc = new SingletonClass(); } Console.WriteLine("实例化类为" + sc.ToString());//用于演示 } return sc;//最终返回本类实例 } } }
在程序中调用如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 创建模式_1.单例模式 { /*23种设计模式-创建模式-单例模式 * 2020年8月31日15:50:44 lhz.06@qq.com * * 意图:保证一个类仅有一个实例或只有指定个数的实例(实例池),并提供一个访问它的全局访问点。 * 主要解决:保证实例的单一性 * 适用于:1当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 2当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 * */ class Program { static void Main(string[] args) { SingletonClass sc = SingletonClass.GetInstance();//调用全局访问点方法 Console.ReadLine(); } } }
运行结果
相关源码下载: