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 }

    五、总结

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

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

  • 相关阅读:
    Proj THUDBFuzz Paper Reading: The Art, Science, and Engineering of Fuzzing: A Survey
    Proj THUDBFuzz Paper Reading: A systematic review of fuzzing based on machine learning techniques
    9.3 付费代理的使用
    11.1 Charles 的使用
    第十一章 APP 的爬取
    10.2 Cookies 池的搭建
    10.1 模拟登录并爬取 GitHub
    11.5 Appium 爬取微信朋友圈
    11.4 Appium 的基本使用
    11.3 mitmdump 爬取 “得到” App 电子书信息
  • 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13140010.html
Copyright © 2011-2022 走看看