1. 程式人生 > >C#設計模式之:工廠方法模式

C#設計模式之:工廠方法模式

工廠方法模式(Factory Method):

定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類

回顧之前簡單工廠
這裡寫圖片描述

簡單工廠的核心程式碼

class OperationFactory
{
    public static Operation createOperate(string operate)
    {
        Operation oper = null;
        switch (operate)
        {
            case "+":
                oper = new OperationAdd();
                break
; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case "/": oper = new OperationDiv(); break; } return oper; } }

將其改成工廠方法模式
這裡寫圖片描述

工廠模式程式碼

public class Operation
{
    private double _numberA = 0;
    private double _numberB = 0;

    public double NumberA { get => _numberA; set => _numberA = value; }
    public double NumberB { get => _numberB; set => _numberB = value; }

    public virtual double GetResult
() { double result = 0; return result; } }
class OperationAdd : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA + NumberB;
        return result;
    }
}
class OperationSub : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA - NumberB;
        return result;
    }
}
OperationMul 類似,略
OperationDiv 類似,略
interface IFactory
{
    Operation CreateOperation();
}
class AddFactory : IFactory
{
    public Operation CreateOperation()
    {
        return new OperationAdd();
    }
}
class SubFactory : IFactory
{
    public Operation CreateOperation()
    {
        return new OperationSub();
    }
}
MulFactory 類似,略
DivFactory 類似,略
// test
IFactory operFactory = new AddFactory();// 如果想要更換為減法,則只要new SubFactory(),其它都不會修改
Operation oper = operFactory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine("結果為: " + result);
// result
結果為: 3

兩者對比

簡單工廠的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇動態例項化相應的類,對於客戶端來說,去除了具體產品的依賴
但在簡單工廠裡,如果想要加入新的演算法運算,則需要修改其switch,違反了設計原則的開閉原則,也就是說對擴充套件開放了,對修改也開放了(而不是封閉)。

從簡單工廠到工廠方法的演化

因為簡單工廠類與 選擇分支 耦合,所以想解耦的話,可以根據依賴倒置原則(根據介面而不是實現程式設計)來實現。
簡單工廠 抽象為 工廠介面 及 多個具體生成物件的工廠,這樣整個工廠和產品體系其實都沒有修改的變化,只有擴充套件的變化,這完全符合 開放-封閉 原則

工廠方法的本質

工廠方法把簡單的內部邏輯判斷轉移到了客戶端程式碼中去了,想加新功能時,本來是修改工廠的,但現在是在修改客戶端。

工廠方法模式克服了簡單工廠違背的開放-封閉原則的缺點,又保持了封裝物件建立過程的優點。
工廠方法模式是簡單工廠模式的進一步抽象和推廣。
缺點:每增加一個產品,就需要增加一個產品工廠的類,增加了額外的開發量。

避免修改客戶端程式碼的,利用“反射”可以解決避免分支判斷的問題