一,工廠模式
在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。
二,介紹
意圖:定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。
主要解決:主要解決接口選擇的問題。
何時使用:我們明確地計划不同條件下創建不同實例時。
如何解決:讓其子類實現工廠接口,返回的也是一個抽象的產品。
關鍵代碼:創建過程在其子類執行。
應用實例:
1、您需要一輛汽車,可以直接從工廠里面提貨,而不用去管這輛汽車是怎么做出來的,以及這個汽車里面的具體實現。
2、Hibernate 換數據庫只需換方言和驅動就可以。
優點:
1、一個調用者想創建一個對象,只要知道其名稱就可以了。
2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。
3、屏蔽產品的具體實現,調用者只關心產品的接口。
缺點:
每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。這並不是什么好事。
使用場景:
1、日志記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日志到什么地方。
2、數據庫訪問,當用戶不知道最后系統采用哪一類數據庫,以及數據庫可能有變化時。
3、設計一個連接服務器的框架,需要三個協議,”POP3”、”IMAP”、”HTTP”,可以把這三個作為產品類,共同實現一個接口。
注意事項:
作為一種創建類模式,在任何需要生成復雜對象的地方,都可以使用工廠方法模式。有一點需要注意的地方就是復雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的復雜度。
三,簡單工廠模式
簡單工廠模式包含以下3個角色:
- Factory(工廠角色)
- Product(抽象產品角色)
- ConcreteProduct(具體產品角色)
//典型的抽象產品類代碼 abstract class Product { //所有產品類的公共業務方法 public void MethodSame() { //公共方法的實現 } //聲明抽象業務方法 public abstract void MethodDiff(); } //典型的具體產品類代碼 class ConcreteProductA : Product { //實現業務方法 public override void MethodDiff() { //業務方法的實現 } } class ConcreteProductB : Product { //實現業務方法 public override void MethodDiff() { //業務方法的實現 } } class Factory { //靜態工廠方法 public Product GetProduct(string arg) { Product product = null; if (arg.Equals("A")) { product = new ConcreteProductA(); //初始化設置product } else if (arg.Equals("B")) { product = new ConcreteProductB(); //初始化設置product } return product; } } class Program { static void Main(string[] args) { Factory factory = new Factory(); Product product = factory.GetProduct("A"); product.MethodDiff(); } }
在簡單工廠模式中用於創建實例的方法有時候是靜態(static)方法,因此有時候被稱為靜態工廠方法(Static Factory Method)模式
四,工廠方法模式
使用工廠方法模式改進后的按鈕工廠:
使用工廠方法模式改進后的按鈕工廠:
工廠方法模式:
- 不再提供一個按鈕工廠類來統一負責所有產品的創建,而是將具體按鈕的創建過程交給專門的工廠子類去完成。
- 如果出現新的按鈕類型,只需要為這種新類型的按鈕定義一個具體的工廠類就可以創建該新按鈕的實例。
工廠方法模式的定義
簡稱為工廠模式(Factory Pattern)。
又可稱作虛擬構造器模式(Virtual Constructor Pattern)或多態工廠模式(Polymorphic Factory Pattern)。
工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象。
目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。
工廠方法模式包含以下4個角色:
- Product(抽象產品)
- ConcreteProduct(具體產品)
- Factory(抽象工廠)
- ConcreteFactory(具體工廠)
//典型的抽象產品類代碼 abstract class Product { //所有產品類的公共業務方法 public void MethodSame() { //公共方法的實現 } //聲明抽象業務方法 public abstract void MethodDiff(); } //典型的具體產品類代碼 class ConcreteProductA : Product { //實現業務方法 public override void MethodDiff() { //業務方法的實現 } } class ConcreteProductB : Product { //實現業務方法 public override void MethodDiff() { //業務方法的實現 } } //典型的抽象工廠類代碼 interface Factory { Product FactoryMethod(); } //典型的具體工廠類代碼 class ConcreteAFactory : Factory { public Product FactoryMethod() { return new ConcreteProductA(); } } class ConcreteBFactory : Factory { public Product FactoryMethod() { return new ConcreteProductB(); } } class Program { static void Main(string[] args) { Factory factory = new ConcreteAFactory(); Product product = factory.FactoryMethod(); product.MethodDiff(); } }