【U3D設計模式】工廠模式

工廠模式專門負責將大量有共同接口的類實例化。工廠模式可以動態決定實例化哪一個類,而不必實現知道要實例化的是哪一個類。
在這個工廠模式家族中有3種形態:
簡單工廠模式,這是他的中文名,英文名叫做Simple Factory。
工廠方法模式,這是他的中文名,英文名叫做Factory Method。
抽象工廠模式,這是他的中文名,英文名叫做Abstract Factory。

現在我們知道了工廠家族在GoF23裏面的幾個隊員叫什麼名字,但是還不熟悉怎麼使用他。不要着急,現在我們就開始學習如何使用他們。在工廠家族中簡單工廠模式是這3種形態裏面最簡單最直接的一種。我們就先從他下手,然後在逐步的瞭解工廠方法模式、抽象工廠模式的使用。

相對於OOP來說,每種設計模式都是一套武功心法,而每套心法對應的武功套路就是模式的具體使用的方式。

修煉簡單工廠模式的心法如下:
1)工廠類角色Creator:工廠類在客戶端的直接控制下(Create方法)創建產品對象。
2)抽象產品角色Product:定義簡單工廠創建的對象的父類或它們共同擁有的接口。可以是一個類、抽象類或接口。
3)具體產品角色ConcreteProduct:定義工廠具體加工出的對象。
修煉簡單工廠模式的武功套路如下:
designModel01 
(備註:上面是簡單工廠模式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中的講解到此結束,下篇我們開始學習新的設計模式,敬請關注!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章