设计模式之单例模式简介

2021-01-06 13:51发布

设计模式是什么???

在开发程序的过程中经常遇到一些典型的问题,在对这些问题进行处理解决的过程中,慢慢的整理出来一套系统的解决方案,这套方案就称之为“设计模式”

在开发过程中也会遇到很多针对性的问题,我们就可以学习前人总结好的各种各样的设计模式,来解决这些编程开发中的问题。

举个栗子:
玩王者荣耀的玩家都知道,在冒险模式的挑战中有个《血王宫回忆》关卡,保证孙膑,钟无艳不死通关,,这时网上就会有很多的 攻略,告诉我们用什么英雄,怎么玩,,,这时我们就可以过关了,这些攻略就可以看做事游戏中的设计模式!

单例设计模式:
什么是单例:
设计一个类的时候,需要保证整个程序在运行期间只存在一个实例对象,解决这个问题,我们需要用到“单例模式”,

注:单例模式是用于非静态类中的,在静态类中写单例无意义。

使用步骤:
1,声明一个静态且私有的当前类型的字段
2,创建私有无参的构造方法,保证外部无法实例化本类
3,创建一个静态类方法用于创建此类的唯一对象

在C#中使用的代码简例:

//通常用的类

using System;


namespace 设计模式_单例

{

    class WebClass

    {

        private string webName;

        private string webUrl;


        public WebClass(string name, string url)

        {

            this.webName = name;

            this.webUrl = url;

        }


        public void Show()

        {

            Console.WriteLine("{0}网站的URL是:{1}",webName,webUrl);

        }


    }

}


//使用单例的类

namespace 设计模式_单例

{

    class DanliClass

    {

        //声明一个静态且私有的当前类型的字段

        private static DanliClass _instance;


        //创建私有构造方法,保证外界访问不到

        private DanliClass() { }


        //创建一个静态类方法用于创建此类的唯一对象

        public static DanliClass _Instance()

        {

            //只有第一次执行的时候会新建对象

            if (_instance == null)

            {

                _instance = new DanliClass();

            }

            return _instance;

        }

    }

}


/*随意创建对象在游戏开发中不但占用内存,还存在其他的缺点,(比如:对敌人血量的控制,不能子弹,大的时候是一个对象,手雷炸的时候也是个对象,这样肯定是不行的)*/


using System;


namespace 设计模式_单例

{

    class Program

    {

        static void Main(string[] args)

        {

            //我们通常使用的对象 方式

            WebClass web1 = new WebClass("CSDN", "www.blog.csdn.net");

            web1.Show();

            WebClass web2 = new WebClass("百度","www.baidu.com");

            web2.Show();


            Console.WriteLine("-------------------");

            Console.WriteLine("单例模式");

            //这样写就不行了

            //DanliClass danli1 = new DanliClass();

            DanliClass danli1 = DanliClass._Instance();

            DanliClass danli2 = DanliClass._Instance();


            Console.WriteLine("两个单例类对象是否是一个:"+danli1.Equals(danli2));



            Console.ReadKey();

        }

    }

}

在Unity中使用单例的时候可以这样:

不挂载到游戏物体身上,做管理类时:

public class GameConfig  {


//通过属性的方式访问

    private static GameConfig _instance;

    public static GameConfig Instance

    {

        get

        {

            if (_instance == null)

            {

             

                _instance = new GameConfig();

                

            }

            return _instance;

        }

    }

    //下面写逻辑代码

}

挂载在游戏物体身上的时候这样:

public class GameConfig : MonoBehaviour {


    public static GameConfig _Instance;


void Awake(){

if(_Instance== null){  

       _Instance= this;  

}  

}

注:一定不要在OnDestroy函数中直接访问单例模式!这样很有可能会造成单例无法销毁