1. 程式人生 > >大話設計模式學習筆記-工廠方法模式

大話設計模式學習筆記-工廠方法模式

ole stat 決定 vol 設計 乘除 under 結果 缺點

工廠方法模式

工廠方法模式定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。


簡單工廠模式的優缺點

簡單工廠模式最大的優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。

但是如果要加一個功能,就需要修改原有的類,增加Case分支,這違背了開放-封閉原則。

將簡單工廠模式改進為工廠方法模式

根據依賴倒轉原則,我們把工廠類抽象出一個接口,這個接口只有一個方法就是創建抽象產品的工廠方法。然後所有的要生產具體類的工廠就去實現這個接口。

當我們要增加功能時就不需要更改原有的工廠類了,只需要增加此功能的類和相應的工廠就可以了。

工廠方法模式需要讓客戶端決定實例化哪個一個工廠來實現類

也就是說工廠方法把簡單工廠的內部邏輯判斷移動到了客戶端代碼來進行。你想要增加功能本來是改工廠類的,而現在是修改客戶端。


改進簡單計算器

工廠接口:IFactory

interface IFactory{
    Operation CreateOperation();
}

加減乘除各建一個具體工廠去實現這個接口

class AddFactory : IFactory{
    public Operation CreateOperation => new OperationAdd();
}
class SubFactory : IFactory{
    
public Operation CreateOperation => new OperationSub(); } class MulFactory : IFactory{ public Operation CreateOperation => new OperationMul(); } class DivFactory : IFactory{ public Operation CreateOperation => new OperationDiv(); }

測試類:Program

IFactory operFactory = new AddFactory();
Operation oper 
= operFactory.CreateOperation; oper.NumbleA = 1; oper.NumbleB = 2; Console.WriteLine(oper.GetResult());//結果:3

雷鋒工廠

雷鋒類:LeiFeng

class LeiFeng{
    public void Sweep() => Console.WriteLine("掃地");
    public void Wash() => Console.WriteLine("洗衣");
    public void BuyRice() => Console.WriteLine("買米");
}

學雷鋒的大學生類:Undergraduate

class Undergraduate : LeiFeng { }

社區誌願者類:Volunteer

class Volunteer : LeiFeng { }

雷鋒工廠類:IFactory

class LeiFeng{
    public void Sweep() => Console.WriteLine("掃地");
    public void Wash() => Console.WriteLine("洗衣");
    public void BuyRice() => Console.WriteLine("買米");
}

學雷鋒的大學生工廠:UndergraduateFactory

class UndergraduateFactory : IFactory{
    public LeiFeng CreateLeiFeng() => new Undergraduate();
}

社區誌願者工廠:VolunteerFactory

class VolunteerFactory : IFactory{
    public LeiFeng CreateLeiFeng() => new Volunteer();
}

測試類:Program

class Program{
    static void Main(){
        IFactory factory = new UndergraduateFactory();
        LeiFeng student = factory.CreateLeiFeng();
        student.BuyRice();
        student.Sweep();
        student.Wash();
        Console.Read();
    }
}

測試結果:控制臺

買米
掃地
洗衣

總結

工方法克服了簡單工廠違背開放-封閉原則的缺點,又保持了封裝對象創建過程的優點。

工廠方法模式是簡單工廠模式的進一步抽象。

缺點是每加一個產品就需要加一個產品工廠的類,增加了額外的開發量。

利用反射可以解決客戶端修改分支判斷的代碼。

大話設計模式學習筆記-工廠方法模式