每日設計模式之工廠方法模式

2021-10-07 21:49:10 字數 1796 閱讀 2409

工廠方法模式(factory method pattern):定義乙個用於建立物件的介面,讓子類決定將哪乙個 類例項化。工廠方法模式讓乙個類的例項化延遲到其子類。工廠方法模式又簡稱為工廠模式 (factory pattern),又可稱作虛擬構造器模式(virtual constructor pattern)或多型工廠模式 (polymorphic factory pattern)。工廠方法模式是一種類建立型模式

//抽象產品

public inte***ce product

//具體產品a

public class concreteproducta implements product

}//具體產品a

public class concreteproductb implements product

}//抽象工廠

public inte***ce factory

//抽象工廠a 對應的是具體產品a

public class concretefactorya implements factory

}//抽象工廠b 對應的是具體產品b

public class concretefactoryb implements factory

}//下面factorystr可以配置到配置檔案yml等中,可以對客戶端**進行修改,不再直接使用new關鍵字來建立具體的工廠類

public class factorymethodclient catch (exception e)

product product = factory.createproduct();

product.create();}}

優點:在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體 產品類將被例項化這一細節,使用者只需要關心所需產品對應的工廠,無須關心建立細節,甚 至無須知道具體產品類的類名。

基於工廠角色和產品角色的多型性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確 定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。工廠方法模 式之所以又被稱為多型工廠模式,就正是因為所有的具體工廠類都具有同一抽象父類

使用工廠方法模式的另乙個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品 提供的介面,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要新增乙個具 體工廠和具體產品就可以了,這樣,系統的可擴充套件性也就變得非常好,完全符合「開閉原則」

缺點:

在新增新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統 中類的個數將成對增加,在一定程度上增加了系統的複雜度,有更多的類需要編譯和執行, 會給系統帶來一些額外的開銷

由於考慮到系統的可擴充套件性,需要引入抽象層,在客戶端**中均使用抽象層進行定義, 增加了系統的抽象性和理解難度,且在實現時可能需要用到配置檔案中讀取配置、反射等技術,增加了系統 的實現難度

適用場景:

客戶端不知道它所需要的物件的類。在工廠方法模式中,客戶端不需要知道具體產品類的 類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立,可將具體工廠類 的類名儲存在配置檔案或資料庫中

抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠類只需要 提供乙個建立產品的介面,而由其子類來確定具體要建立的物件,利用物件導向的多型性和 黎克特制代換原則,在程式執行時,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件

設計模式 工廠模式之工廠方法模式

工廠方法模式是指定義乙個建立物件的介面,然後實現這個介面的工廠來決定建立什麼樣的例項。工廠方法讓類的例項推遲到子類中進行。在這個模式中,只關心需要建立的是什麼工廠,不需要關心建立的細節。而且新加入的產品符合開閉原則。1 建立支付介面,裡面定義抽象的支付方法。package com.gupao.vip...

設計模式之工廠方法模式

package com.csair.design.pattern 工廠方法,有抽象基類,每個子類生產乙個具體物件,與抽象工廠的關係是,抽象工廠生產多個產品 產品有某種內在聯絡 工廠方法只生產乙個物件 author ppt public class factorymethod public stati...

設計模式之工廠方法模式

在介紹工廠方法模式之前,先來介紹一下簡單工廠。什麼是簡單工廠?在類中,難免要例項化一些類,那麼我們把這些類的例項化抽離出來封裝成乙個工廠類,工廠類提供乙個公共的靜態或非靜態的方法來返回其他物件所需要的物件。這樣做的目的就是將物件的例項化與邏輯 分開,提高 的復用能力。這就是簡單工廠。public a...