提供一個介面,建立一系列相關或相依物件,而無需指定其具體類別。
休閒 FPS 遊戲,8-16 人分組對戰。場景初始化需載入兩大元素:模型(骨架)與 紋理(貼圖)。地圖數量持續增加,若直接在代碼中硬編碼具體類別,擴充極其困難。引入 Abstract Factory,工廠產出介面/抽象類別,新增場景無需修改載入邏輯。
using System;
using System.Reflection;
namespace AbstractFactoryExample
{
class Program
{
static void Main(string[] args)
{
Patrix patrix = new Patrix();
patrix.LoadScene("HalfPaper");
patrix.LoadScene("Matrix");
}
}
class Patrix
{
private PatrixSceneFactory GetGameScene(string sceneName)
{
return (PatrixSceneFactory)Assembly.Load("AbstractFactoryExample")
.CreateInstance("AbstractFactoryExample." + sceneName);
}
public void LoadScene(string sceneName)
{
PatrixSceneFactory psf = GetGameScene(sceneName);
Texture texture = psf.CreateTexture();
Model model = psf.CreateModel();
model.FillTexture(texture);
}
}
abstract class PatrixSceneFactory
{
public abstract Model CreateModel();
public abstract Texture CreateTexture();
}
abstract class Model
{
public abstract void FillTexture(Texture texture);
}
abstract class Texture { }
// HalfPaper 場景系列
class HalfPaper : PatrixSceneFactory
{
public override Model CreateModel() => new HalfPaperModel();
public override Texture CreateTexture() => new HalfPaperTexture();
}
class HalfPaperModel : Model
{
public HalfPaperModel() => Console.WriteLine("HalfPaper Model Created");
public override void FillTexture(Texture texture) => Console.WriteLine("HalfPaper Model is filled Texture");
}
class HalfPaperTexture : Texture
{
public HalfPaperTexture() => Console.WriteLine("HalfPaper Texture Created");
}
// Matrix 場景系列
class Matrix : PatrixSceneFactory
{
public override Model CreateModel() => new MatrixModel();
public override Texture CreateTexture() => new MatrixTexture();
}
class MatrixModel : Model
{
public MatrixModel() => Console.WriteLine("Matrix Model Created");
public override void FillTexture(Texture texture) => Console.WriteLine("Matrix Model is filled Texture");
}
class MatrixTexture : Texture
{
public MatrixTexture() => Console.WriteLine("Matrix Texture Created");
}
}
| 角色 | 類別 | 說明 |
|---|---|---|
| AbstractFactory | PatrixSceneFactory | 宣告建立系列產品的介面 |
| ConcreteFactory | HalfPaper, Matrix | 實作具體產品建立邏輯 |
| AbstractProduct | Model, Texture | 產品抽象介面 |
| ConcreteProduct | HalfPaperModel, MatrixTexture 等 | 具體產品實作 |
| Client | Patrix | 透過工廠介面使用產品 |