1、引言編程
上一篇介紹了最基本的簡單工廠模式,其中提到:簡單工廠模式系統難以擴展,一旦添加新產品就不得不修改簡單工廠方法,如此會形成簡單工廠的實現邏輯過於複雜,本文介紹的工廠模式能夠有效的解決此問題。ide
2、定義:spa
工廠模式:定義一個用於建立對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。設計
工廠模式實現時,客戶端須要決定實例化哪個工廠類實現運算類,選擇判斷的問題仍是存在的,即:工廠方法把簡單工廠的內部邏輯判斷轉移到了客戶端來進行。若是須要增長功能,則修改客戶端。3d
3、UML圖代理
角色: code
抽象工廠Creator:聲明工廠方法,返回一個產品。 對象
具體工廠角色ConcreteCreator:實現生成具體產品的方法,返回一個具體產品。blog
抽象產品角色Product:上述全部類的父類或者是接口。接口
具體產品角色Concrete Product:由工廠類建立出來的具體的產品實例。
UML圖:
4、舉例說明:
在簡單工廠模式中用實現加減乘除的實例進行具體說明,本節將繼續使用此例說明工廠模式。
抽象產品:
public class Operation { private double numberA = 0; private double numberB = 0; public double NumberA { get { return numberA; } set { numberA = value; } } public double NumberB { get { return 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; } } class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) { throw new Exception("除數不能爲0"); } result = NumberA / NumberB; return result; } }
抽象工廠:
interface IFactory { Operation CreateOperation(); }
具體工廠:
class AddFactory : IFactory { public Operation CreateOperation() { return new OperationAdd(); } } class SubFactory : IFactory { public Operation CreateOperation() { return new OperationSub(); } } class MulFactory : IFactory { public Operation CreateOperation() { return new OperationMul(); } } class DivFactory : IFactory { public Operation CreateOperation() { return new OperationDiv(); } }
客戶端調用:
static void Main(string[] args) { IFactory operFactory = new AddFactory(); Operation oper = operFactory.CreateOperation(); oper.NumberA = 3; oper.NumberB = 7; double result = oper.GetResult(); Console.WriteLine(result); }
5、優缺點及適用場合
優勢:
1)基於工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它可以使工廠能夠自主肯定建立何種產品對象。並且如何建立一個具體產品的細節徹底封裝在具體工廠內部,符合高內聚,低耦合。
2)在系統中加入新產品時,無需修改抽象工廠和抽象產品提供的接口,無需修改客戶端,也無需修改其餘的具體工廠和具體產品,很好的利用了封裝和委託。
缺點:
添加新的功能產品時,須要編寫新的具體產品類,並增長相應的具體工廠類。
應用場景:
1)類不知道須要建立什麼對象,由客戶端決定須要建立對象時。
2)當類將建立對象的職責委託給多個子類中的一個,而且但願子類是代理這一這一信息局部化的時候。(摘抄,不是很明白這一點)
6、總結
工廠模式經過面向對象編程中的多態性將對象的建立延遲到具體的工廠中,從而解決了簡單工廠模式中存在的問題,同時遵循設計原則:對擴展開放,對修改關閉。