结合Unity浅谈设计模式-单例

来源:互联网 发布:拇指特效软件 编辑:程序博客网 时间:2024/05/20 01:46

首先声明代码部分为c#语言

为什么说是浅谈设计模式,因为我本人目前还未工作,今年下半年才会开始找工作,所以所有的关于设计模式的认知都是从一些书上和网上了解的。我自己认为,设计模式真的很精髓,不会设计模式的程序员算不上是个好程序员,但是这个东西不是那么好掌握的,没完整的参与开发过一些项目是很难有深刻的理解的。所以写这个专题不是说我参与过什么大的项目开发有很深的理解(并没有参与过),而是为了让自己巩固和大家了解设计模式是啥,掌握之前先得知道它是啥。我不知道我会写几篇,总之,以后我也会写,尤其是工作后有了深刻的理解后,好,闲话就说这么多。


今天的主题是设计模式中的单例设计模式,首先我们得知道啥叫设计模式,所谓设计模式就是前人在软件开发过程中对一类问题总结出来的通用解决方案,你可以理解为一种代码结构或框架。可以联想为数学上的一类题型,解决这类问题的规范步骤就可以认为是一种设计模式。

单例设计模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。

这里写图片描述

因为单例模式保证了类只被实例化一次,所以数据是独一份的,又提供了全局的访问点,所以这个就比较爽了。结合到Unity中的话就是GameManager,UIManager都可以做成单例模式,还有就是游戏中的金币,点券这些数据都应该只有一份,其它类都是访问这一份数据,不然就乱套了。


了解了概念就该上代码了,因为对于程序员来说,代码是最直接的

using UnityEngine;using System.Collections;public class Sigleton{    private static sigleton _instance;    private sigleton(){}    public static sigleton instance{        get{            if(_instance==null)                _instance = new sigleton();            return _instance;        }    }}

看到这个代码应该就清楚了,为了防止被实例化多次,我们把构造函数设为私有

上面这个是单线程的,我们下面为多线程的

using UnityEngine;using System.Collections;public class Sigleton{     private static volatile Sigleton _instance = null;//volatile保证编译器会按写好的代码顺序去编译而不会自动优化,导致出现多个实例     private static object locker = new object();//声明一个锁     private Sigleton(){}    // 多重检查     public static Sigleton Instance(){         if(_instance==null){             lock(locker){                 if(_instance==null)                     _instance = new Sigleton();             }         }         return _instance;     }}

多线程就比单线程复杂了,因为要上锁

下面这种写法,单线程,多线程都可以用

using UnityEngine;using System.Collections;public class Sigleton{    public static readonly Sigleton Instance = new Sigleton();//readonly保证变量只能被赋值一次private Sigleton(){}}

这种写法使用了C#语言的特性,readonly关键字。上面这种写法等价于下面这种

using UnityEngine;using System.Collections;public class Sigleton{    public static readonly Sigleton Instance;//readonly保证变量只能被赋值一次private Sigleton(){}//缺点是静态构造函数只能被系统调用,且不能带参数,和修饰符    static Sigleton(){        Instance = new Sigleton();    }

下面是个通用的

using UnityEngine;using System.Collections;public abstract class Singleton<T> where T:class,new (){    protected static T _instance = null;    public static T Instance{    get{        if(_instance==null)            _instance = new Singleton();    }    return _instance;    }    protected Singleton(){        if(_instance!=null)            print(111);        Init();    }    public virtual void Init(){    }}
using UnityEngine;using System.Collections;public class GameManager :Singleton<GameManager>{    public int a;    public int b;    //可以初始化数据    public override void Init(){        a = 111;        b = 222;    }}

上面这些都是单独的类,下面这个是继承MonoBehaviour

using UnityEngine;using System.Collections;using UnityEngine.UI;public class GameManager : MonoBehaviour {    private static GameManager _instance;    public static GameManager Instance{        get{            return _instance;        }    }    // Use this for initialization    void Awake () {        if (_instance == null) {            _instance = this;            DontDestroyOnLoad (gameObject);        }        else if (_instance != this)            Destroy (gameObject);    }}

推荐一些学习设计模式的途径,书的话有《大话设计模式》,《设计模式》(比较抽象),视频泰课在线上有一些。好,这篇就到这里,如有不对的地方,欢迎批评指正。