從簡單工廠模式我們可以看出,在簡單工廠模式中,增加新的產品類,是需要修改工廠類的,這不符合開放-封閉原則.而且在寫工廠類的時候必須知道具體產品類的細節.也不符合由上相下的設計原則,如果要延後關注細節,則必須利用繼承或者介面的技術來實現.將簡單工廠模式中的工廠抽象,增加抽象工廠角色,這樣使用者,抽象工廠,抽象產品,使用者就形成了最頂層的設計層面,具體的實現由具體的工廠來建立具體的產品.著就是工廠方法模式.
工廠方法模式角色:使用者,抽象工廠,抽象產品,具體工廠,具體產品.
工廠方法模式採用乙個具體工廠生產一種具體產品的方式進行產品的建立.使用者具體要建立那種產品的選擇邏輯推給了使用者,使用者通過選擇不同的具體工廠來實現不同產品的建立選擇.
工廠方法的優點:
1.符合開放封閉原則,因為增加新的產品不需要修改原來已有的工廠類,只需要增加相應的工廠即可.
2.將使用和建立的責任分開.
3.符合設計的先抽象後具體的順序.
缺點:1.如果產品類太多會導致增加很多的類,會使系統顯得很不簡潔.
2.如果將選擇邏輯交給使用者,則在一定程度上增加了使用者對細節的依賴;
3.與簡單工廠模式相比,增加了工廠本身的建立開銷.
4.使用者需要建立工廠類本身.(通過一定的方法可以將工廠類的建立委託給抽象類去完成.見例子.
抽象工廠方法是工廠方法更一般的表達,工廠方法可以針對產品族(如控制項的windows族控制項,unix族控制項),如果只有一族產品(比如只有windows族)則就退化成簡單工廠方法(如果除掉抽象工廠,將工廠方法變為靜態的方法,利用引數化減少工廠方法數量為1個,則就是簡單工廠方法).)(乙個工廠類,每個工廠方法建立一種產品).而如果只有一類產品(如只有button控制項),則退化成標準的工廠方法類似
using system;
using system.collections.generic;
using system.linq;
using system.text;
//變形的工廠方法
namespace mybasestudy
//利用模板方法將工廠類的建立委託給抽象工廠本身。
public static abstractproduct createproductm2() where t : abstractfactory,new()
public abstract abstractproduct createaproduct();
}abstract class abstractproduct
class concretefactorya : abstractfactory
}class concretefactoryb : abstractfactory
}class concreteproducta : abstractproduct
public override double getprice()
public override void addprice(double p)
}class concreteproductb : abstractproduct
public override double getprice()
public override void addprice(double p)
class client}}
工廠方法和簡單工廠一樣,如果產品類太多都會導致具體的工廠類或方法過多,改進的辦法是利用泛型,當然也可以利用反射,而且利用反射還可以進行引數化構造,但不利的地方是這同樣會導致使用者對構造細節的依賴.hibernate的構造方式其實就是這種方式,他將使用者對構造細節的依賴轉換成了可以動態配置的檔案形式,而不是直接依賴.採用這種方式還有的好處就是工廠可以創造多種產品.但這種方式的乙個缺點是需要採用動態引數構造目標產品的時候,這種方式就很難辦到了.
設計模式 工廠模式之工廠方法模式
工廠方法模式是指定義乙個建立物件的介面,然後實現這個介面的工廠來決定建立什麼樣的例項。工廠方法讓類的例項推遲到子類中進行。在這個模式中,只關心需要建立的是什麼工廠,不需要關心建立的細節。而且新加入的產品符合開閉原則。1 建立支付介面,裡面定義抽象的支付方法。package com.gupao.vip...
設計模式之工廠方法模式
package com.csair.design.pattern 工廠方法,有抽象基類,每個子類生產乙個具體物件,與抽象工廠的關係是,抽象工廠生產多個產品 產品有某種內在聯絡 工廠方法只生產乙個物件 author ppt public class factorymethod public stati...
設計模式之工廠方法模式
在介紹工廠方法模式之前,先來介紹一下簡單工廠。什麼是簡單工廠?在類中,難免要例項化一些類,那麼我們把這些類的例項化抽離出來封裝成乙個工廠類,工廠類提供乙個公共的靜態或非靜態的方法來返回其他物件所需要的物件。這樣做的目的就是將物件的例項化與邏輯 分開,提高 的復用能力。這就是簡單工廠。public a...