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

C# 設計模式實戰:Factory Method 工廠方法模式完整解析(一)

     編輯:關於C語言

模式意圖

定義一個建立產品物件的工廠介面,將實際建立工作延遲到子類別中。

應用場景:遊戲場景物件建立

承接抽象工廠範例:場景類別不僅建立 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");
    }
}

關鍵設計決策

  • 動態載入組件 + 反射建立工廠,Client 完全解耦具體類別
  • PatrixScene 同時扮演「抽象產品」與「抽象工廠」雙重角色
  • InitScene() 為 Template Method,封裝固定初始化順序
  • 新增場景僅需新增 Factory + Scene + Model + Texture 四個類別,零修改 Client
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved