Head First設計模式之工廠模式
一、定義
定義了一個創建對象的接口, 但由子類決定要實例化的類是哪一個. 工廠方法讓類把實例化推遲到子類
二、結構
![]()
1、抽象工廠角色:這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。
2、具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。
3、抽象產品角色:它是具體產品繼承的父類或者是實現的接口。
4、具體產品角色:具體工廠角色所創建的對象就是此角色的實例。
三、實現
namespace DesignPatterns.FactoryMethod { class Program { static void Main(string[] args) { Console.WriteLine("使用工廠方法進行計算"); Factory factory1 = new AddFactory(); Operation operation1 = factory1.CreateOperation(); operation1.numberA = 10; operation1.numberB = 20; Console.WriteLine("{0}+{1}={2}", operation1.numberA, operation1.numberB, operation1.GetResult()); Factory factory2 = new SubFactory(); Operation operation2 = factory2.CreateOperation(); operation2.numberA = 10; operation2.numberB = 20; Console.WriteLine("{0}-{1}={2}", operation2.numberA, operation2.numberB, operation2.GetResult()); Console.Read(); } } /// <summary> /// 抽象操作類 /// </summary> public abstract class Operation { public int numberA; public int numberB; public abstract int GetResult(); } /// <summary> /// 加法操作 /// </summary> public class AddOperation : Operation { public override int GetResult() { return (this.numberA + this.numberB); } } /// <summary> /// 減法操作 /// </summary> public class SubOperation : Operation { public override int GetResult() { return (this.numberA - this.numberB); } } public abstract class Factory { public abstract Operation CreateOperation(); } public class AddFactory : Factory { public override Operation CreateOperation() { return new AddOperation(); } } public class SubFactory : Factory { public override Operation CreateOperation() { return new SubOperation(); } } }
四、適用場景
- 類不知道自己要創建哪一個對象時
- 類用它的子類來指定創建哪個對象
- 當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候
五、優缺點
優點:
- 基于工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定創建何種產品對象。而且如何創建一個具體產品的細節完全封裝在具體工廠內部,符合高內聚,低耦合。
- 在系統中加入新產品時,無需修改抽象工廠和抽象產品提供的接口,無需修改客戶端,也無需修改其他的具體工廠和具體產品,很好的利用了封裝和委托。
缺點:
- 在添加新產品時,需要編寫新的具體產品類(其實這不算一個缺點,因為這是不可避免的),要增加與之對應的具體工廠類。
參考:
http://www.rzrgm.cn/yinxiangpei/articles/2366092.html
http://www.rzrgm.cn/ywqu/archive/2010/01/07/1640855.html
http://www.rzrgm.cn/Terrylee/archive/2006/01/04/310716.html
歡迎閱讀本系列文章:Head First設計模式之目錄

浙公網安備 33010602011771號