定義一個建立產品物件的工廠介面,將實際建立工作延遲到子類別中。
承接抽象工廠範例:場景類別不僅建立 Model/Texture 系列,還需執行初始化。Client 不應直接依賴具體場景類別(HalfPaper 等),引入工廠方法建立場景物件。
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
{
private PatrixSceneFactory GetGameScene(string sceneName)
{
return (PatrixSceneFactory)Assembly.Load("FactoryMethodExample")
.CreateInstance("FactoryMethodExample." + sceneName + "Factory");
}
public void LoadScene(string sceneName)
{
PatrixSceneFactory psf = GetGameScene(sceneName);
PatrixScene ps = psf.CreateScene();
ps.InitScene();
}
}
abstract class PatrixSceneFactory
{
public abstract PatrixScene CreateScene();
}
abstract class PatrixScene
{
public void InitScene() // Template Method
{
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 { }
// HalfPaper 系列
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");
}
// Matrix 系列
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");
}
}