找回密码
 立即注册
搜索

工厂方法模式在unity3d里面的使用(转)

[复制链接]

36

主题

36

帖子

139

积分

注册会员

Rank: 2

积分
139
54070 VR-空白 发表于 2015-5-25 14:23:50 楼主
本帖最后由 VR-空白 于 2015-5-26 10:02 编辑

上一篇文章中我们讲了工厂家族里面的最简单的一套武功心法–简单工厂模式。想必大家已经领悟了如何修炼此内功心法了,也熟悉了此套武功心法所存在的弊端,稍不慎就毙命。所以我们需要学习另一套武功心法—工厂方法模式,来杜绝简单工厂模式存在的问题。

修炼工厂方法模式的心法如下:
1) 抽象工厂角色Creator:是工厂方法模式的核心,与应用程序无关。在此模式中创建的对象的工厂类必须实现这个接口。
2) 具体工厂角色ConcreteCreator:这是实现抽象工厂接口的具体工厂类,包含于应用程序密切相关的逻辑,并且由应用程序调用来创建产品对象。
3) 抽象产品角色Product:工厂方法模式所创建的对象的基类型或接口,也就是产品对象的共同父类或共同拥有的接口。
4) 具体产品角色ConcreteProduct:这个角色实现了抽象产品角色所定义的接口。具体的产品有专门的具体工厂创建,他们之间往往一一对应。

修炼工厂方法模式的武功套路如下:
54.png
(备注:上面是工厂方法模式demo里面的定向关系图文档的截图!)

修炼心法与武功套路的对应:
1) 抽象工厂角色Creator对应武功套路里面的CreatorResourceFactory。
2) 具体工厂角色ConcreteCreator对应武功套路里面的UIResourceManagerFactory和AudioResourceManagerFactory。
3) 抽象产品角色Product对应武功套路里面的ResourceManager。
4) 具体产品角色ConcreteProduct对应武功套路里面的UIResourceManager和AudioResourceManager。
上面描述了工厂方法模式的修炼心法和武功套路。下面就给出具体的套路细节。
建议:看下面代码之前,可以先根据工厂方法模式的心法及对应的武功套路先行修炼。

抽象工厂角色:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace FactoryMethod
  4. {
  5.     /// <summary>
  6.     /// 简单方法模式的抽象工厂,由具体工厂来继承实现
  7.     /// </summary>
  8.     public abstract class CreatorResourceFactory
  9.     {
  10.         public abstract ResourceManager CreateFactory();
  11.     }
  12. }
复制代码

具体工厂角色:
音频资源管理工厂
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace FactoryMethod
  4. {
  5.     /// <summary>
  6.     /// 简单方法模式里面的具体产品-音频资源管理工厂
  7.     /// </summary>
  8.     public class AudioResouceManagerFactory : CreatorResourceFactory
  9.     {
  10.         public override ResourceManager CreateFactory()
  11.         {
  12.             return new AudioResouceManager();
  13.         }
  14.     }
  15. }
复制代码

UI资源管理工厂
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace FactoryMethod
  4. {
  5.     /// <summary>
  6.     /// 简单方法模式里面的具体产品工厂-UI资源管理工厂
  7.     /// </summary>
  8.     public class UIResouceManagerFactory : CreatorResourceFactory
  9.     {
  10.         public override ResourceManager CreateFactory()
  11.         {
  12.             return new UIResourceManager();
  13.         }
  14.     }
  15. }
复制代码

抽象产品角色:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace FactoryMethod
  4. {
  5.     /// <summary>
  6.     /// 工厂方法模式抽象产品的具体产品实现-音频资源管理产品类
  7.     /// </summary>
  8.     public class AudioResouceManager : ResourceManager
  9.     {
  10.         public override void LoadConfig(string path)
  11.         {
  12.             Debug.Log("加载和音乐有关的配置文件");
  13.         }
  14.         public override void LoadAsset(string name)
  15.         {
  16.             Debug.Log("加载音乐文件");
  17.         }
  18.         public override void UnLoadResource(bool status)
  19.         {
  20.             Debug.Log("卸载加载的音乐文件");
  21.         }
  22.     }
  23. }
复制代码

UI资源产品
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace FactoryMethod
  4. {
  5.     /// <summary>
  6.     /// 工厂方法模式抽象产品的具体产品实现-音频资源管理产品类
  7.     /// </summary>
  8.     public class UIResouceManager : ResourceManager
  9.     {
  10.         public override void LoadConfig(string path)
  11.         {
  12.             Debug.Log("加载UI有关的配置文件");
  13.         }
  14.         public override void LoadAsset(string name)
  15.         {
  16.             Debug.Log("加载UI文件");
  17.         }
  18.         public override void UnLoadResource(bool status)
  19.         {
  20.             Debug.Log("卸载加载的UI文件");
  21.         }
  22.     }
  23. }
复制代码

客户端测试类:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace FactoryMethod
  4. {
  5.     public class ResouceFactoryMethodClient : MonoBehaviour
  6.     {
  7.         #region 定义具体产品工厂
  8.         CreatorResourceFactory audioFactory;
  9.         CreatorResourceFactory uiFactory;
  10.         #endregion
  11.         #region 定义具体产品
  12.         ResourceManager audioManager;
  13.         ResourceManager uiManager;
  14.         #endregion
  15.         void Start()
  16.         {
  17.             audioFactory = new AudioResouceManagerFactory();
  18.             uiFactory = new UIResouceManagerFactory();
  19.         }
  20.         void OnGUI()
  21.         {
  22.             if (GUILayout.Button("音乐管理器"))
  23.             {
  24.                 audioManager = audioFactory.CreateFactory();
  25.                 audioManager.LoadConfig("http:....");
  26.                 audioManager.LoadAsset("音频资源");
  27.                 audioManager.UnLoadResource(false);
  28.             }
  29.             if (GUILayout.Button("界面管理器"))
  30.             {
  31.                 uiManager = uiFactory.CreateFactory();
  32.                 uiManager.LoadConfig("http:....");
  33.                 uiManager.LoadAsset("UI资源");
  34.                 uiManager.UnLoadResource(false);
  35.             }
  36.         }
  37.     }
  38. }
复制代码

工厂方法模式的优缺点:
优点:
1) 工厂方法模式通过OOP中的多态性将对象的创建延迟到具体工厂中,从而解决了简单工厂模式存在的问题,也很好的符合了开放封闭原则-OCP(即对扩展开放,对修改封闭)。
2) 子类提供挂钩。基类为工厂方法提供默认实现,子类可以重写,也可以继承父类的实现。
3) 连接并行的类层次结构 。
4) 良好的封装性,代码结构清晰。
5) 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
6) 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
7) 扩展性好,在增加产品类的情况下,只需要修改具体的工程类或扩展一个工程类,就可以“拥抱变化”。
缺点:
每次增加一个产品时,都需要增加一个具体类和对应的具体工厂,这样使系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。



原文链接:http://www.unity.5helpyou.com/2526.html



使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则