修煉工廠方法模式的心法如下:
1) 抽象工廠角色Creator:是工廠方法模式的核心,與應用程序無關。在此模式中創建的對象的工廠類必須實現這個接口。
2) 具體工廠角色ConcreteCreator:這是實現抽象工廠接口的具體工廠類,包含於應用程序密切相關的邏輯,並且由應用程序調用來創建產品對象。
3) 抽象產品角色Product:工廠方法模式所創建的對象的基類型或接口,也就是產品對象的共同父類或共同擁有的接口。
4)具體產品角色ConcreteProduct:這個角色實現了抽象產品角色所定義的接口。具體的產品有專門的具體工廠創建,他們之間往往一一對應。
using UnityEngine;
using System.Collections;
using System;
namespace FactoryMethod
{
// 抽象工廠
public abstract class CreatorResourceFactory
{
public abstract ResourceManage CreateFactroy();
}
/// <summary>
/// 具體工廠
/// </summary>
// UI管理
public class UIResourceManageFactory:CreatorResourceFactory
{
public override ResourceManage CreateFactroy()
{
return new UIResourceManage();
}
}
// 音效管理
public class AudioResourceManageFactory:CreatorResourceFactory
{
public override ResourceManage CreateFactroy()
{
return new AudioResourceManage();
}
}
/// <summary>
/// 抽象產品
/// </summary>
public abstract class ResourceManage
{
public abstract void LoadConfig(string path);
public abstract void LoadAsset(string name);
public abstract void UnLoadResource(bool state);
}
/// <summary>
/// 具體產品
/// </summary>
// Client UIResourceManage
public class UIResourceManage :ResourceManage
{
public override void LoadConfig(string path)
{
Debug.Log("ui 路徑:"+path);
}
public override void LoadAsset(string name)
{
Debug.Log("ui資源名字:" + name);
}
public override void UnLoadResource(bool state)
{
Debug.Log("ui 是否加載:" + state);
}
}
// Client AudioResourceManage
public class AudioResourceManage : ResourceManage
{
public override void LoadConfig(string path)
{
Debug.Log("Audio路徑:" + path);
}
public override void LoadAsset(string name)
{
Debug.Log("Audio資源名字:" + name);
}
public override void UnLoadResource(bool state)
{
Debug.Log("Audio是否加載:" + state);
}
}
}
客戶端
using UnityEngine;
using System.Collections;
public class ResourceFactoryMethodClient : MonoBehaviour {
// Use this for initialization
// 定義具體產品工廠
FactoryMethod.CreatorResourceFactory uiResourceManager;
FactoryMethod.CreatorResourceFactory audioResourceManager;
// 定義具體產品
FactoryMethod.ResourceManage uiManager;
FactoryMethod.ResourceManage audioManager;
void Start () {
//從抽象工廠到具體工廠
uiResourceManager = new FactoryMethod.UIResourceManageFactory();
audioResourceManager = new FactoryMethod.AudioResourceManageFactory();
}
void OnGUI()
{
if (GUILayout.Button ("ui管理"))
{
uiManager = uiResourceManager.CreateFactroy();
uiManager.LoadAsset("Cc");
uiManager.LoadConfig("UI");
uiManager.UnLoadResource(false);
}
if (GUILayout.Button ("Auido管理"))
{
audioManager = audioResourceManager.CreateFactroy();
audioManager.LoadAsset("Jj");
audioManager.LoadConfig("Audio");
audioManager.UnLoadResource(false);
}
}
}