找回密码
 立即注册
搜索

简单工厂模式在unity3d里面的使用(转)

[复制链接]

36

主题

36

帖子

139

积分

注册会员

Rank: 2

积分
139
68430 VR-空白 发表于 2015-5-25 13:54:45 楼主
本帖最后由 VR-空白 于 2015-5-26 09:50 编辑

工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定实例化哪一个类,而不必实现知道要实例化的是哪一个类。
在这个工厂模式家族中有3种形态:
简单工厂模式,这是他的中文名,英文名叫做Simple Factory。
工厂方法模式,这是他的中文名,英文名叫做Factory Method。
抽象工厂模式,这是他的中文名,英文名叫做Abstract Factory。

现在我们知道了工厂家族在GoF23里面的几个队员叫什么名字,但是还不熟悉怎么使用他。不要着急,现在我们就开始学习如何使用他们。在工厂家族中简单工厂模式是这3种形态里面最简单最直接的一种。我们就先从他下手,然后在逐步的了解工厂方法模式、抽象工厂模式的使用。

相对于OOP来说,每种设计模式都是一套武功心法,而每套心法对应的武功套路就是模式的具体使用的方式。

修炼简单工厂模式的心法如下:
1)工厂类角色Creator:工厂类在客户端的直接控制下(Create方法)创建产品对象。
2)抽象产品角色Product:定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
3)具体产品角色ConcreteProduct:定义工厂具体加工出的对象。

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

修炼心法与武功套路的对应:
1) 工厂类角色Creator对应武功套路里面的ResourceSimpleFactory。
2) 抽象产品角色Product对应武功套路里面的ResourceManager。
3) 具体产品角色ConcreteProduct对应武功套路里面的UIResourceManager和AudioResourceManager。
上面描述了简单工厂模式的修炼心法和武功套路。下面就给出具体的套路细节。
建议:看下面代码之前,自己先动手练习下为好。

工厂类角色:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace SimpleFactory
  4. {
  5.     /// <summary>
  6.     /// 简单资源工厂类,负责创建UI,Audio等管理器的实例。
  7.     /// </summary>
  8.     public class ResouceSimpleFactory
  9.     {
  10.         // 方式一
  11.         public ResouceManager CreateManager(string type)
  12.         {
  13.             if (type == "UI")
  14.             {
  15.                 return new UIResouceManager();
  16.             }
  17.             else if (type == "Audio")
  18.             {
  19.                 return new AudioResourceManager();
  20.             }
  21.             else
  22.             {
  23.                 return null;
  24.             }
  25.         }
  26.         //方式二
  27.         public ResouceManager CreateManager(ResourceEnum re)
  28.         {
  29.             switch (re)
  30.             {
  31.                 case ResourceEnum.UIResource:
  32.                     return new UIResouceManager();
  33.                 case ResourceEnum.AudioResouce:
  34.                     return new AudioResourceManager();
  35.                 default:
  36.                     return null;
  37.             }
  38.         }
  39.     }
  40. }
复制代码

抽象产品类:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace SimpleFactory
  4. {
  5.     /// <summary>
  6.     /// 资源管理器基类,抽象产品
  7.     /// </summary>
  8.     public abstract class ResouceManager
  9.     {
  10.         public abstract void LoadConfig(string path);
  11.         public abstract void LoadAsset(string name);
  12.         public abstract void UnLoadResource(bool status);
  13.     }
  14. }
复制代码

具体产品类:
具体产品AudioResourceManager:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace SimpleFactory
  4. {
  5.     /// <summary>
  6.     /// Audio资源管理器,抽象产品的具体产品
  7.     /// </summary>
  8.     public class AudioResourceManager : ResouceManager
  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. }
复制代码

具体产品UIResourceManager:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace SimpleFactory
  4. {
  5.     /// <summary>
  6.     /// UI资源管理器,抽象产品的具体产品
  7.     /// </summary>
  8.     public class UIResouceManager : ResouceManager
  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 SimpleFactory
  4. {
  5.     /// <summary>
  6.     /// 定义资源枚举类型
  7.     /// </summary>
  8.     public enum ResourceEnum
  9.     {
  10.         None,
  11.         UIResource,
  12.         AudioResouce
  13.     }
  14. }
复制代码

客户端测试类:
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace SimpleFactory
  4. {
  5.     /// <summary>
  6.     /// 使用资源管理器的客户端
  7.     /// </summary>
  8.     public class ResouceSimpleFactoryClient : MonoBehaviour
  9.     {
  10.         ResouceSimpleFactory rf;
  11.         public void Start()
  12.         {
  13.             rf = new ResouceSimpleFactory();
  14.         }
  15.         public void OnGUI()
  16.         {
  17.             if (GUILayout.Button("UI管理器"))
  18.             {
  19.                 ResouceManager ui = rf.CreateManager("UI");
  20.                 ui.LoadConfig("http:.......");
  21.                 ui.LoadAsset("UI资源");
  22.                 ui.UnLoadResource(false);
  23.             }
  24.             if (GUILayout.Button("Audio管理器"))
  25.             {
  26.                 ResouceManager am = rf.CreateManager("Audio");
  27.                 am.LoadConfig("http:.....");
  28.                 am.LoadAsset("声音资源");
  29.                 am.UnLoadResource(false);
  30.             }
  31.         }
  32.     }
  33. }
复制代码

搞懂了上面的武功心法和武功套路,你也就领悟了简单工厂模式。
每种武功都有他的优缺点,例如七伤拳,你懂得。那么简单工厂模式的优缺点是什么呢?接着往下看,你就明白了。
简单工厂模式优缺点:

优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。

缺点:
1) 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2) 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
3) 简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

本篇文章关于简单工厂设计模式在unity3d中的讲解到此结束,下篇我们开始学习新的设计模式,敬请关注!

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





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

本版积分规则