首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計模式無廢話系列(四):Factory Method 工廠方法模式

     編輯:關於C#

意圖

定義創建產品對象的工廠介面,將實際創建工作延遲到子類。

適用場景

上篇用 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");
    }
}

程式碼執行結果

Factory Method 執行結果

程式碼解析

  • 基於 Abstract Factory 範例修改,體現 Abstract Factory、Factory Method、Template Method 三模式協作。
  • PatrixSceneFactory:單一產品抽象工廠(Factory Method 的抽象工廠角色)。
  • HalfPaperFactory/MatrixFactory:具體工廠角色,負責創建具體產品。
  • PatrixScene:抽象產品角色(Factory Method)兼抽象工廠角色(Abstract Factory),負責創建模型/紋理產品族。InitScene 為模板方法,封裝初始化共同步驟。
  • HalfPaper/Matrix:具體產品角色(Factory Method)兼具體工廠角色(Abstract Factory)。
  • Abstract Factory 抽象層次較高,規範產品族一致性(如 N 卡 7/8 系列皆分低中高端)。Factory Method 針對單一產品創建,提取共同步驟自然用上 Template Method。工廠方法還能應對具體產品創建易變性(如 HalfPaperFactory 改創建 HalfPaperSpecial 只需改工廠)。
  • 目的:調用端盡量依賴介面/穩定層,讓變化發生在介面之下。無工廠模式時,調用端需直接依賴具體場景/紋理/模型類,條件判斷創建,新增場景需大幅調整調用端,風險難控。

何時採用

  • 代碼角度:需創建易變對象、或由子類決定創建哪個對象。
  • 應用角度:具體產品創建不穩定、或客戶端無需知道創建哪個具體產品(框架/工具包常見,如列印類由工廠決定超寬/普通列印對象)。

實作要點

  • 透過繼承創建具體產品,通常每具體產品對應一具體工廠。
  • 具體工廠類決定如何創建具體產品;調用端只知工廠回傳的是抽象產品。

注意事項

  • Factory Method 通常每具體產品對應一具體工廠,濫用會導致類別數量激增。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved