javaSE-02流程控制
工廠模式定義
工廠方法模式是一種建立型設計模式, 其在父類中提供一個建立物件的方法, 允許子類決定例項化物件的型別。
代理模式結構圖和實現
結構圖
實現方式
- 讓所有產品都遵循同一介面。 該介面必須宣告對所有產品都有意義的方法。
- 在建立類中新增一個空的工廠方法。 該方法的返回型別必須遵循通用的產品介面。
- 在建立者程式碼中找到對於產品建構函式的所有引用。 將它們依次替換為對於工廠方法的呼叫, 同時將建立產品的程式碼移入工廠方法。 你可能需要在工廠方法中新增臨時引數來控制返回的產品型別。
- 為工廠方法中的每種產品編寫一個建立者子類, 然後在子類中重寫工廠方法, 並將基本方法中的相關建立程式碼移動到工廠方法中。
程式碼實現
這裡還是拿之前簡單工廠模式那個栗子來做
首先我們先建立一個運算類的父類
定義兩個屬性以及一個獲取結果的虛方法
public class Operation { public double NumA { get; set; } public double NumB { get; set; } public virtual double GetResult() { double result = 0; return result; } }
接著,建立一個工廠介面,這個介面目的就是為了讓派生類來決定到底要例項化哪一個運運算元類
interface IFactory
{
Operation CreateOperation();
}
然後去建立幾個派生自運算基類的具體運算類,如假髮、減法等具體實現類
public class OperationAdd : Operation { public override double GetResult() { return NumA + NumB; } } .....
再去構建對應的工廠方法,繼承自工廠介面
public class AddFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
最後,客戶端呼叫,這裡寫的有點爛,別介意,看主要的就行
IFactory factory;
Operation operation = null;
switch (oper)
{
case "+":
factory = new AddFactory();
operation = factory.CreateOperation();
operation.NumA = Convert.ToDouble(num1);
operation.NumB = Convert.ToDouble(num2);
break;
case "-":
factory = new SubFactory();
operation = factory.CreateOperation();
operation.NumA = Convert.ToDouble(num1);
operation.NumB = Convert.ToDouble(num2);
break;
default:
break;
}
可以發現,我們在例項工廠介面時,並沒有直接去例項化工廠介面,而是例項化它的派生類,然後再例項化運算具體實現類,通過factory.CreateOperation();
讓它自己去找對應的工廠類,而不同的工廠類裡面又去例項化了對應的運算方法,最終就是通過呼叫operation.GetResult()
取到運算結果
工廠模式優缺點
優點
- 可以避免建立者和具體產品之間的緊密耦合。
- 單一職責原則。 你可以將產品建立程式碼放在程式的單一位置, 從而使得程式碼更容易維護。
- 開閉原則。 無需更改現有客戶端程式碼, 你就可以在程式中引入新的產品型別。
缺點
- 應用工廠方法模式需要引入許多新的子類, 程式碼可能會因此變得更復雜。 最好的情況是將該模式引入建立者類的現有層次結構中。
- 而且可能還會存在大量分支判斷等
工廠模式使用場景
1、當你在編寫程式碼的過程中,如果無法預知物件確切類別及其依賴關係時,可使用工廠方法。
工廠方法將建立產品的程式碼與實際使用產品的程式碼分離, 從而能在不影響其他程式碼的情況下擴充套件產品建立部分程式碼。
例如, 如果需要嚮應用中新增一種新產品, 你只需要開發新的建立者子類, 然後重寫其工廠方法即可。
2、 如果你希望使用者能擴充套件你軟體庫或框架的內部元件****, 可使用工廠方法****。
繼承可能是擴充套件軟體庫或框架預設行為的最簡單方法。 但是當你使用子類替代標準組件時, 框架如何辨識出該子類?
解決方案是將各框架中構造元件的程式碼集中到單個工廠方法中, 並在繼承該元件之外允許任何人對該方法進行重寫。
3、如果你希望複用現有物件來節省系統資源****, 而不是每次都重新建立物件****, 可使用工廠方法****。
在處理大型資源密集型物件 (比如資料庫連線、 檔案系統和網路資源) 時, 你會經常碰到這種資源需求。
簡單工廠與工廠模式有什麼區別?
簡單工廠模式最大的優點在於工廠類中包含了必要的邏輯判斷,根據客戶端選擇的條件去例項化相關的類,對於客戶端來說,去除了與具體產品的依賴,使得客戶端無需過多關係底層的具體實現。而在使用工廠方法模式實現時,客戶端需要決定到底去例項化哪一個工廠類,大量的羅技分支判斷可能還是存在的。簡單來說就是把那些判斷又搬到了客戶端,如果想要擴充套件新功能,就只需要去建立相關的類和工廠,達到了開閉原則和單一職責原則,但也會使得程式碼層次可能有點繁雜和冗餘。