设计模式 之 单例模式简介

98 阅读3分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情


设计模式是什么?

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

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

举个栗子:

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

单例设计模式:

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

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

使用步骤:

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函数中直接访问单例模式!这样很有可能会造成单例无法销毁