zoukankan      html  css  js  c++  java
  • Unity 单例模式

    一、单例模式(Slingleton Pattern)

      单例模式是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
      这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    二、单例的特性

    • 单例类只能有一个实例,并且有声明周期
    • 单例类必须自己创建自己的唯一实例
    • 单例类提供一个全局访问点,在任何地方都可以获取

     当然,单例类除了带来的好处,也是伴随着风险的

    • 如果你使用的是懒加载形式的单例,他的初始化就是不可控的,因为是在第一次访问的时候才创建

    • 因为可以全局访问,所以如果使用不当,逻辑就会散落到各地,逻辑之间的引用会非常混乱

    • 因为可以通过Instance获取实例对象,所以内部的成员变量就会暴露出来,从而带来被修改的风险

     可能在项目初期或者项目较小的时候,大家没有什么感觉,但是随着项目规模增大,这些都是隐患。

    三、如何回避风险

      处理这些问题的方法可能很多,可以在各方面对它进行限制,例如:
    • 首先在单例里增加初始化方法,然后在合适的时机主动去初始化这个单例,已达到控制其生命周期的目的

    • 使用静态方法,这样就不会把实例暴露出来

    • 严格控制API的数量和自身的职责

    四、几种单例模式

      懒汉模式:如果不调用则不会进行实例化

     1 public class Slingleton_Pattern : MonoBehaviour
     2 {
     3     private static Slingleton_Pattern Instance;
     4 
     5     public static Slingleton_Pattern _Instance()
     6     {
     7         if(Instance == null)
     8         {
     9             Instance = new Slingleton_Pattern();
    10         }
    11         return Instance;
    12     }
    13 }

      饿汉模式:系统运行则主动实例化

    1 public class Slingleton_Pattern : MonoBehaviour
    2 {
    3     private static Slingleton_Pattern Instance = new Slingleton_Pattern();
    4 
    5     public static Slingleton_Pattern _Instance()
    6     {
    7         return Instance;
    8     }
    9 }

      继承MonoBehaviour:便于其他模块调用,但非唯一性

     1 public class Slingleton_Pattern : MonoBehaviour
     2 {
     3     private static Slingleton_Pattern Instance;
     4 
     5     void Awake()
     6     {
     7         Instance = this;
     8     }
     9 
    10     public static Slingleton_Pattern _Instance()
    11     {
    12         return Instance;
    13     }
    14 }

      其他

     1 public class Slingleton_Pattern : MonoBehaviour
     2 {
     3     private static Slingleton_Pattern Instance = null;
     4 
     5     public static Slingleton_Pattern _Instance
     6     {
     7         get
     8         {
     9             if (Instance == null)
    10             {
    11                 Instance = FindObjectOfType(typeof(Slingleton_Pattern)) as Slingleton_Pattern;
    12             }
    13             return Instance;
    14         }
    15     }
    16 }

    五、总结

      单例的使用风险是可以在任意处进行访问,并且开放了实例的访问权限,在项目庞大的时候滥用单例会导致引用逻辑混乱,所以我们在设计项目结构的时候,尽量让业务模块和自己模块的逻辑形成单向的访问,避免所有逻辑交叉访问,设计单例的时候,对单例做限制,防止外界获取单例的整个实例,只对外界开放一部分服务,这样便可以缓解使用单例模式带来的风险和危害。

    ***| 以上内容仅为学习参考、学习笔记使用 |***

  • 相关阅读:
    Python数据分析的几种绘图方式——数据可视化(附源码)
    Python GUI项目实战:主窗体的界面设计与实现
    Python Scrapy框架:数据爬取全流程
    python来爬取煎蛋网随手拍小姐姐图片
    有意思的逻辑小练习:函数做参数进行传递
    python值*args和**kwargs的总结思考
    数据类型的基础知识补充,字典的并交集、空集合、可作为字典元组的元素、删除字典中的元素
    python里面为什么shell和保存文件运行结果不一样的相关思考(内存相关)
    代码:购物车(待修改)
    python里面为什么shell和保存文件运行结果不一样?
  • 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13140010.html
Copyright © 2011-2022 走看看