设计模式--简单工厂模式在unity3d里面的使用
发表于2016-05-29
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定实例化哪一个类,而不必实现知道要实例化的是哪一个类。
在这个工厂模式家族中有3种形态:
简单工厂模式,这是他的中文名,英文名叫做Simple Factory。
工厂方法模式,这是他的中文名,英文名叫做Factory Method。
抽象工厂模式,这是他的中文名,英文名叫做Abstract Factory。
现在我们知道了工厂家族在GoF23里面的几个队员叫什么名字,但是还不熟悉怎么使用他。不要着急,现在我们就开始学习如何使用他们。在工厂家族中简单工厂模式是这3种形态里面最简单最直接的一种。我们就先从他下手,然后在逐步的了解工厂方法模式、抽象工厂模式的使用。
相对于OOP来说,每种设计模式都是一套武功心法,而每套心法对应的武功套路就是模式的具体使用的方式。
修炼简单工厂模式的心法如下:
1、工厂类角色Creator:工厂类在客户端的直接控制下(Create方法)创建产品对象。
2、抽象产品角色Product:定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
3、具体产品角色ConcreteProduct:定义工厂具体加工出的对象。
修炼简单工厂模式的武功套路如下:

(备注:上面是简单工厂模式demo里的定向关系图文档的截图!)
修炼心法与武功套路的对应:
1、工厂类角色Creator对应武功套路里面的ResourceSimpleFactory。
2、抽象产品角色Product对应武功套路里面的ResourceManager。
3、具体产品角色ConcreteProduct对应武功套路里面的UIResourceManager和AudioResourceManager。
上面描述了简单工厂模式的修炼心法和武功套路。下面就给出具体的套路细节。
建议:看下面代码之前,自己先动手练习下为好。
工厂类角色:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | using UnityEngine; using System.Collections; namespace SimpleFactory { ///
/// 简单资源工厂类,负责创建UI,Audio等管理器的实例。 /// public class ResouceSimpleFactory { // 方式一 public ResouceManager CreateManager( string type) { if (type == "UI" ) { return new UIResouceManager(); } else if (type == "Audio" ) { return new AudioResourceManager(); } else { return null ; } } //方式二 public ResouceManager CreateManager(ResourceEnum re) { switch (re) { case ResourceEnum.UIResource: return new UIResouceManager(); case ResourceEnum.AudioResouce: return new AudioResourceManager(); default : return null ; } } } } |
抽象产品类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using UnityEngine; using System.Collections; namespace SimpleFactory { ///
/// 资源管理器基类,抽象产品 /// public abstract class ResouceManager { public abstract void LoadConfig( string path); public abstract void LoadAsset( string name); public abstract void UnLoadResource( bool status); } } |
具体产品类:
具体产品AudioResourceManager:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; namespace SimpleFactory { ///
/// Audio资源管理器,抽象产品的具体产品 /// public class AudioResourceManager : ResouceManager { public override void LoadConfig( string path) { Debug.Log( "加载和音乐有关的配置文件" ); } public override void LoadAsset( string name) { Debug.Log( "加载音乐文件" ); } public override void UnLoadResource( bool status) { Debug.Log( "卸载加载的音乐文件" ); } } } |
具体产品UIResourceManager:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; using System.Collections; namespace SimpleFactory { ///
/// UI资源管理器,抽象产品的具体产品 /// public class UIResouceManager : ResouceManager { public override void LoadConfig( string path) { Debug.Log( "加载UI的配置文件" ); } public override void LoadAsset( string name) { Debug.Log( "加载UI里面的资源" ); } public override void UnLoadResource( bool status) { Debug.Log( "卸载加载的UI资源" ); } } } |
资源类型枚举类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | using UnityEngine; using System.Collections; namespace SimpleFactory { ///
/// 定义资源枚举类型 /// public enum ResourceEnum { None, UIResource, AudioResouce } } |
客户端测试类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | using UnityEngine; using System.Collections; namespace SimpleFactory { ///
/// 使用资源管理器的客户端 /// public class ResouceSimpleFactoryClient : MonoBehaviour { ResouceSimpleFactory rf; public void Start() { rf = new ResouceSimpleFactory(); } public void OnGUI() { if (GUILayout.Button( "UI管理器" )) { ResouceManager ui = rf.CreateManager( "UI" ); ui.LoadConfig( "http:......." ); ui.LoadAsset( "蛮牛" ); ui.UnLoadResource( false ); } if (GUILayout.Button( "Audio管理器" )) { ResouceManager am = rf.CreateManager( "Audio" ); am.LoadConfig( "http:....." ); am.LoadAsset( "蛮牛" ); am.UnLoadResource( false ); } } } } |
搞懂了上面的武功心法和武功套路,你也就领悟了简单工厂模式。
每种武功都有他的优缺点,例如七伤拳,你懂得。那么简单工厂模式的优缺点是什么呢?接着往下看,你就明白了。
简单工厂模式优缺点:
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
1、当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
3、简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。
在这里野猪先给大家提一个醒,GoF23设计模式里面的每种模式都是针对某类特定问题的解决策略。So,没有什么设计模式是完美的!
好了,简单工厂模式就讲到这里。敬请期待如何修炼工厂方法模式。
Tips:告诉大家一个小秘密,简单工厂模式实际上不是GoF23设计模式的一员哦!