当前位置:   article > 正文

Unity中使用设计模式(单例模式、观察者模式、工厂模式、策略模式、组合模式)_设计模式在unity中的应用

设计模式在unity中的应用

一、单例模式:它保证一个类只有一个实例,且提供一个全局访问点。使用单例模式是为了节约资源,避免多个实例的产生导致不必要的开销。
1.使用泛型创建通用单例脚本(不能挂载)

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. //where如果约束为MonoBehaviour,则T可以是派生子MonoBehaviour的组件或脚本
  5. public class SingleMono<T> : MonoBehaviour where T:new()
  6. {
  7. private static T instance;
  8. public static T Instance
  9. {
  10. get
  11. {
  12. if(instance == null) instance = new T();
  13. return instance;
  14. }
  15. }
  16. }

2.不使用泛型创建单例脚本
(1)真单例:在多线程环境下,保证只有一个实例对象,并且线程安全(可以跨场景调用)

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class RealSingle
  5. {
  6. private static RealSingle instance;
  7. public static RealSingle Instance
  8. {
  9. get
  10. {
  11. if(instance == null)
  12. {
  13. instance = new RealSingle();
  14. }
  15. return instance;
  16. }
  17. }
  18. }

(2)伪单例:适合在单线程环境下使用,多线程环境容易造成多个实例对象的产生(不能跨场景调用,因为它继承了MonoBehaviour)

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class FakeSingle : MonoBehaviour
  5. {
  6. public static FakeSingle instance;
  7. private void Awake()
  8. {
  9. instance = this;
  10. }
  11. }

更多内容:单例模式 | 菜鸟教程

二、观察者模式:它定义了一种一对多的依赖关系,让多个观察者对象同时监听 某一个主题对象,当主题对象状态发生改变时,所有依赖者(观察者)都会收到通知并自动更新

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ObserverDemo : MonoBehaviour
  5. {
  6. public delegate void CallBack(object param);
  7. public event CallBack callBackEvent;
  8. Dictionary<int,List<CallBack>> dicEvent=new Dictionary<int,List<CallBack>>();
  9. //添加事件方法
  10. public void AddEvent(int eventID,CallBack callBack)
  11. {
  12. if(!dicEvent.ContainsKey(eventID))
  13. {
  14. List<CallBack> list = new List<CallBack>();
  15. list.Add(callBack);
  16. dicEvent.Add(eventID, list);
  17. callBackEvent += callBack;
  18. }
  19. else
  20. {
  21. if (!dicEvent[eventID].Contains(callBack))
  22. {
  23. dicEvent[eventID].Add(callBack);
  24. callBackEvent += callBack;
  25. }
  26. else
  27. {
  28. return;
  29. }
  30. }
  31. }
  32. //删除事件方法
  33. public void DelEvent(int eventID,CallBack callBack)
  34. {
  35. if(!dicEvent.ContainsKey(eventID)) return;
  36. if (!dicEvent[eventID].Contains(callBack)) return;
  37. dicEvent[eventID].Remove(callBack);
  38. callBackEvent -= callBack;
  39. if (dicEvent[eventID].Count==0)
  40. {
  41. dicEvent.Remove(eventID);
  42. }
  43. }
  44. //通过委托来通知某个eventID下的CallBack组
  45. public void SendEvent(int eventID,object param)
  46. {
  47. if (dicEvent[eventID].Count>0)
  48. {
  49. foreach(var item in dicEvent[eventID])
  50. {
  51. item(param);
  52. }
  53. }
  54. }
  55. //通过事件来通知所有CallBack
  56. public void SendAllEvent(object param)
  57. {
  58. callBackEvent(param);
  59. }
  60. private void Start()
  61. {
  62. AddEvent(0,Show);
  63. object temp=null;
  64. SendEvent(0, temp);
  65. SendAllEvent(temp);
  66. DelEvent(0, Show);
  67. }
  68. void Show(object param)
  69. {
  70. Debug.Log("更新");
  71. }
  72. }

更多内容:观察者模式 | 菜鸟教程

三、工厂模式:通过定义一个工厂类来创建对象,而不是直接在代码中创建对象。它可以隐藏对象创建的细节,从而使代码更加灵活和可维护。


抽象类:不能被实例化。可以包括抽象方法和非抽象方法,且抽象方法中不能有方法体,抽象类一经继承,就必须实现抽象类中的抽象方法(抽象类继承抽象类除外)
接口:属于引用类型。不能实例化,且不能包含属性字段,只能写方法声明,不能有存在方法体的方法。一经继承,必须实现接口中的所有方法声明(接口继承接口除外)

(1)简单工厂模式:只有一个工厂类来创建所有对象。缺乏灵活性,无法扩展。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class FactoryDemo : MonoBehaviour
  5. {
  6. private void Start()
  7. {
  8. Factory factory = GetComputer(Computer.Lenovo);
  9. factory.FactoryObject();
  10. factory = GetComputer(Computer.Huawei);
  11. factory.FactoryObject();
  12. }
  13. public Factory GetComputer(Computer com)
  14. {
  15. Factory factory = null;
  16. switch (com)
  17. {
  18. case Computer.Lenovo:factory = new Lenovo();break;
  19. case Computer.Huawei: factory = new HuaWei(); break;
  20. default: Debug.Log("工厂无法生产"); break;
  21. }
  22. return factory;
  23. }
  24. }
  25. public enum Computer {Lenovo,Huawei}
  26. public abstract class Factory
  27. {
  28. public string name = "电脑";
  29. //虚函数可重写可不重写
  30. public virtual void FactoryObject()
  31. {
  32. Debug.Log("生产" + name);
  33. }
  34. }
  35. class Lenovo:Factory
  36. {
  37. public Lenovo()
  38. {
  39. name = "联想";
  40. }
  41. }
  42. class HuaWei:Factory
  43. {
  44. public HuaWei()
  45. {
  46. name = "华为";
  47. }
  48. }

(2)复杂工厂模式:通常有多个工厂类来创建不同种类的对象。更加容易扩展和修改

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ComplexFactoryDemo : MonoBehaviour
  5. {
  6. private void Start()
  7. {
  8. FactoryElectronics factory = new Factory1();
  9. factory.CreateComputer().GetInfo();
  10. factory.CreatePhone().CallInfo();
  11. factory=new Factory2();
  12. factory.CreateComputer().GetInfo();
  13. factory.CreatePhone().CallInfo();
  14. }
  15. }
  16. interface IElectronics
  17. {
  18. void SameInfo();
  19. }
  20. interface IComputer : IElectronics
  21. {
  22. void GetInfo();
  23. }
  24. interface IPhone : IElectronics
  25. {
  26. void CallInfo();
  27. }
  28. class LenoveComputer : IComputer
  29. {
  30. public void GetInfo()
  31. {
  32. Debug.Log("联想电脑");
  33. }
  34. public void SameInfo()
  35. {
  36. Debug.Log("这是电子产品");
  37. }
  38. }
  39. class AppleComputer : IComputer
  40. {
  41. public void GetInfo()
  42. {
  43. Debug.Log("苹果电脑");
  44. }
  45. public void SameInfo()
  46. {
  47. Debug.Log("这是电子产品");
  48. }
  49. }
  50. class HuaWei : IPhone
  51. {
  52. public void CallInfo()
  53. {
  54. Debug.Log("华为手机");
  55. }
  56. public void SameInfo()
  57. {
  58. Debug.Log("这是电子产品");
  59. }
  60. }
  61. class Apple : IPhone
  62. {
  63. public void CallInfo()
  64. {
  65. Debug.Log("苹果手机");
  66. }
  67. public void SameInfo()
  68. {
  69. Debug.Log("这是电子产品");
  70. }
  71. }
  72. interface FactoryElectronics
  73. {
  74. IComputer CreateComputer();
  75. IPhone CreatePhone();
  76. }
  77. class Factory1 : FactoryElectronics
  78. {
  79. public IComputer CreateComputer()
  80. {
  81. return new LenoveComputer();
  82. }
  83. public IPhone CreatePhone()
  84. {
  85. return new HuaWei();
  86. }
  87. }
  88. class Factory2 : FactoryElectronics
  89. {
  90. public IComputer CreateComputer()
  91. {
  92. return new AppleComputer();
  93. }
  94. public IPhone CreatePhone()
  95. {
  96. return new Apple();
  97. }
  98. }

更多内容:工厂模式 | 菜鸟教程

四、策略模式:将算法的选择和算法的实现分开,使算法可以独立于使用它的客户端而变化

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class StrategyDemo : MonoBehaviour
  5. {
  6. private void Start()
  7. {
  8. PeopleAttack peopleAttack = new PeopleAttack();
  9. peopleAttack.hitDamage(new Weapon1()).HitAttack();
  10. }
  11. }
  12. interface WeaponSkill
  13. {
  14. void HitAttack();
  15. }
  16. class Weapon1 : WeaponSkill
  17. {
  18. public void HitAttack()
  19. { Debug.Log("攻击距离1"); }
  20. }
  21. class Weapon2 : WeaponSkill
  22. {
  23. public void HitAttack()
  24. { Debug.Log("攻击距离2"); }
  25. }
  26. class Weapon3 : WeaponSkill
  27. {
  28. public void HitAttack()
  29. { Debug.Log("攻击距离3");}
  30. }
  31. class PeopleAttack
  32. {
  33. public WeaponSkill hitDamage(WeaponSkill weaponSkill)
  34. {
  35. weaponSkill = new Weapon3();
  36. return weaponSkill;
  37. }
  38. }

更多内容:策略模式 | 菜鸟教程

五、组合模式:可以使用户处理单个对象一样来处理对象的组合,从而使得用户在使用对象时可以忽略对象与组合之间的差别

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class CompositeDemo : MonoBehaviour
  5. {
  6. private void Start()
  7. {
  8. //就是给某些物体加多个或给另外一些物体加一个
  9. this.gameObject.AddComponent<RunInfo>();
  10. this.gameObject.AddComponent<RunInfo>();
  11. }
  12. }
  13. public class RunInfo:MonoBehaviour
  14. { public void Run() { } }
  15. public class WalkInfo : MonoBehaviour
  16. { public void Walk() { } }
  17. public class JumpInfo : MonoBehaviour
  18. { public void Jump() { } }

更多内容:组合模式 | 菜鸟教程

结语:合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/865631
推荐阅读
相关标签
  

闽ICP备14008679号