美文网首页
第十七章 单例模式

第十七章 单例模式

作者: 万恶的意外er | 来源:发表于2019-05-18 17:40 被阅读0次

单例模式(Singleton),是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。并且提供一个访问它的全局访问点。

Singleton 类,定义了一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。

单线程时候的单例类

class Singleton
    {
         //私有静态实例
        private static Singleton instance; 
        //私有化无参构造 不能在类外部创建实例
        private Singleton()
        {

        }
        //此方式是获取本类的唯一实例
        public static Singleton GetInstance()
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }

多线程时候的单例类

多线程的程序中,多个线程同时,注意是同时访问Singleton类,调用GetInstance()方法,会有可能创建多个实例。所以可以给进程加一把锁来处理,lock是确保当一个线程位于代码的临街区时,另一个线程不能够进入临界区,如果其他线程试图进入锁定的代码,则它将会一直等待(即被阻止),直到该对象被释放。

class Singleton
    {
        private static Singleton instance;
        //程序运行时创建一个静态只读的进程辅助对象;
        private static readonly object syncRoot = new object();

        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            //在同一个时刻加了锁的那部分程序只有一个线程可以访问;
            lock (syncRoot)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
            return instance;
        }
    }

双重锁定单例类

当同时有两个线程调用了GetInstance()方法时,他们都可以通过第一重的instance==null的判断,然后由于lock机制,只有一个线程进入,另一个排队等候,当第一个释放了之后,如果没有第二重instance==null判定,就可能创建出两个实例。

class Singleton
    {
        private static Singleton instance;
        private static readonly object syncRoot = new object();
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            if (instance==null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

unity常用的两种单例模式

1.这个是不继承自MonoBehaviour的,通常用在不使用unity特性的脚本
public class Singleton<T>
{
    private static T _instance;

    protected Singleton()
    {
        Init();
    }

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = Activator.CreateInstance<T>();                
            }
            return _instance;
        }
    }
    protected virtual void Init() { }
}
2.继承自MonoBehaviour的单例 拥有Awake() Start() Update() 方法 等unity特性的 单例。
abstract public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    private static bool _bIsDestroy = false;
    private static T _instance = null;

    void Awake()
    {
        AwakeHandle();
    }

    public static T Instance
    {
        get
        {
            if (_instance == null && !_bIsDestroy)
            {
                _instance = FindObjectOfType(typeof(T)) as T;
                
                if (_instance == null)
                {
                    GameObject obj = new GameObject(typeof(T).Name, typeof(T));
                    _instance = obj.GetComponent<T>() as T;
                    //if (typeof(T).Equals(typeof(MonsterController)))
                    //{
                        //Debug.Log("new MonoSingle");
                    //}
                }
                _bIsDestroy = false;
            }
            return _instance;
        }
    }

相关文章

  • 第4章单例模式

    第4章单例模式 4.1 实现单例模式 或者 意义不大 4.2 透明的单例模式 构造函数很奇怪 让这一单例类变成一个...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 基础-单例模式

    单例模式总结-Python实现 面试里每次问设计模式,必问单例模式 来自《Python设计模式》(第2版) 1.理...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

网友评论

      本文标题:第十七章 单例模式

      本文链接:https://www.haomeiwen.com/subject/ykafaqtx.html