工廠模式專門負責將大量有共同接口的類實例化。工廠模式可以動態決定實例化哪一個類,而不必實現知道要實例化的是哪一個類。
在這個工廠模式家族中有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。
上面描述了簡單工廠模式的修煉心法和武功套路。下面就給出具體的套路細節。
建議:看下面代碼之前,自己先動手練習下爲好。
工廠類角色:
using UnityEngine; using System.Collections; namespace SimpleFactory { /// <summary> /// 簡單資源工廠類,負責創建UI,Audio等管理器的實例。 /// </summary> 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; } } } }
抽象產品類:
using UnityEngine; using System.Collections; namespace SimpleFactory { /// <summary> /// 資源管理器基類,抽象產品 /// </summary> public abstract class ResouceManager { public abstract void LoadConfig(string path); public abstract void LoadAsset(string name); public abstract void UnLoadResource(bool status); } }
具體產品類:
具體產品AudioResourceManager:
using UnityEngine; using System.Collections; namespace SimpleFactory { /// <summary> /// Audio資源管理器,抽象產品的具體產品 /// </summary> 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:
using UnityEngine; using System.Collections; namespace SimpleFactory { /// <summary> /// UI資源管理器,抽象產品的具體產品 /// </summary> 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資源"); } } }
資源類型枚舉類:
using UnityEngine; using System.Collections; namespace SimpleFactory { /// <summary> /// 定義資源枚舉類型 /// </summary> public enum ResourceEnum { None, UIResource, AudioResouce } }
客戶端測試類:
using UnityEngine; using System.Collections; namespace SimpleFactory { /// <summary> /// 使用資源管理器的客戶端 /// </summary> 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資源"); ui.UnLoadResource(false); } if (GUILayout.Button("Audio管理器")) { ResouceManager am = rf.CreateManager("Audio"); am.LoadConfig("http:....."); am.LoadAsset("聲音資源"); am.UnLoadResource(false); } } } }
搞懂了上面的武功心法和武功套路,你也就領悟了簡單工廠模式。
每種武功都有他的優缺點,例如七傷拳,你懂得。那麼簡單工廠模式的優缺點是什麼呢?接着往下看,你就明白了。
簡單工廠模式優缺點:
優點:
工廠類含有必要的判斷邏輯,可以決定在什麼時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅”消費”產品。簡單工廠模式通過這種做法實現了對責任的分割。
缺點:
1) 當產品有複雜的多層等級結構時,工廠類只有自己,以不變應萬變,就是模式的缺點。因爲工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。
2) 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,有可能造成工廠邏輯過於複雜。
3) 簡單工廠模式通常使用靜態工廠方法,這使得無法由子類繼承,造成工廠角色無法形成基於繼承的等級結構。
本篇文章關於簡單工廠設計模式在unity3d中的講解到此結束,下篇我們開始學習新的設計模式,敬請關注!