C# 设计模式系列教程-单例模式
1. 描述: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2. 单例模式主要有3个特点,: 2.1 单例类确保自己只有一个实例。 3. 实现方式:懒汉单例类和饿汉单例类 3.1 懒汉式单例类 3.2 饿汉式单例 3.3 懒汉模式和饿汉模式的优缺点: 4. 代码实现: 4.1 懒汉式 public class Singleton { private static Singleton m_Instance; private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { if (m_Instance == null) { m_Instance = new Singleton(); } return m_Instance; } } 4.2 饿汉式 // 定义为sealed防止派生,因为派生可能增加实例 public sealed class Singleton { private static readonly Singleton m_Instance = new Singleton(); private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { return m_Instance; } } 5. 模式总结 5.1 优点: 5.2 缺点: 5.3 适用场合: 5.4 对设计原则的支持: 使用单例模式最核心的一点是体现了面向对象封装特性中的“单一职责”原则。 6. 补充: 在多线程开放过程中,对使用懒汉单例模式应防止两个线程同时去实例化对象,这是有可能的。 下面给出解决方案 6.1 使用锁机制 public class Singleton { private static Singleton m_Instance; static readonly object o = new object(); private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { lock (o) { if (m_Instance == null) { m_Instance = new Singleton(); } } return m_Instance; } } 使用锁机制可以防止两个线程同时创建对象,但这里有个性能问题,每当一个线程访问GetInstance()这个方法是,都要加锁,这其实是没必要的。 6.2 双重锁定 public class Singleton { private static Singleton m_Instance; static readonly object o = new object(); private Singleton() { // 将默认构造函数定义为私有,防止外部调用它实例化别的对象 } public static Singleton GetInstance() { // 这里增加了一个判断实例是否存在,只有在不存在时才给加锁,也就是在这个实例的生命周期中只加过一次锁 if (m_Instance == null) { lock (o) { if (m_Instance == null) { m_Instance = new Singleton(); } } } return m_Instance; } } 双重锁定保证了实例在它的生命周期中只被锁定一次,因而它对性能不会有影响。 以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |