定義創建產品對象的工廠介面,將實際創建工作延遲到子類。
上篇用 Abstract Factory 解決產品族創建,但場景類(HalfPaper)本身為具體工廠。場景類除創建產品族外尚需初始化工作,調用端需獲得場景實例。不應直接依賴具體場景類 → 引入 Factory Method 創建具體產品(場景)。
using System;
using System.Reflection;
namespace FactoryMethodExample
{
class Program
{
static void Main(string[] args)
{
Patrix patrix = new Patrix();
patrix.LoadScene("HalfPaper");
patrix.LoadScene("Matrix");
}
}
class Patrix
{
PatrixSceneFactory GetGameScene(string name) =>
(PatrixSceneFactory)Assembly.Load("FactoryMethodExample")
.CreateInstance($"FactoryMethodExample.{name}Factory");
public void LoadScene(string gameSceneName)
{
PatrixSceneFactory psf = GetGameScene(gameSceneName);
PatrixScene ps = psf.CreateScene();
ps.InitScene();
}
}
abstract class PatrixSceneFactory { public abstract PatrixScene CreateScene(); }
abstract class PatrixScene
{
public void InitScene()
{
Texture texture = CreateTexture();
Model model = CreateModel();
model.FillTexture(texture);
}
public abstract Model CreateModel();
public abstract Texture CreateTexture();
}
abstract class Model { public abstract void FillTexture(Texture texture); }
abstract class Texture { }
class HalfPaperFactory : PatrixSceneFactory
{
public override PatrixScene CreateScene() => new HalfPaper();
}
class HalfPaper : PatrixScene
{
public HalfPaper() => Console.WriteLine("HalfPaper Creating");
public override Model CreateModel() => new HalfPaperModel();
public override Texture CreateTexture() => new HalfPaperTexture();
}
class HalfPaperModel : Model
{
public HalfPaperModel() => Console.WriteLine("HalfPaper Model Creating");
public override void FillTexture(Texture texture) => Console.WriteLine("HalfPaper Model is filled Texture");
}
class HalfPaperTexture : Texture
{
public HalfPaperTexture() => Console.WriteLine("HalfPaper Texture Created");
}
class MatrixFactory : PatrixSceneFactory
{
public override PatrixScene CreateScene() => new Matrix();
}
class Matrix : PatrixScene
{
public Matrix() => Console.WriteLine("Matrix Created");
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");
}
}
InitScene 為模板方法,封裝初始化共同步驟。