工廠方法模式

2022-07-16 23:33:19 字數 2968 閱讀 3260

定義

定義乙個用於建立物件的介面,讓子類決定例項化哪個類,工廠方法使乙個類的例項化延遲到其子類。

通用類圖

在工廠方法模式中,抽象產品類product負責定義產品的共性,實現對事物最抽象定義;creator為抽象建立類,也就是抽象工廠,具體如何建立產品類是由具體的實現工廠concretecreator完成的。工廠方法模式的變種較多,我們來看乙個比較實用的通用原始碼。

通用**

抽象產品類:

public

abstract

class

product //

抽象方法

public

abstract

void

method2();

}

具體產品類:

public

class concreteproduct1 extends

product }

public

class concreteproduct2 extends

product

}

抽象工廠類:

public

abstract

class

creator

ps.

public

void

write(integer i, integer ia);

public

void write(double d, double da);

的范型版本為

public void write(t t, t ta);

具體工廠類:

public

class concretecreator extends

creator

catch

(exception e)

return

product; }

}

客戶端使用:

public

class

client

}

工廠模式的優點

首先,良好的封裝性,**結構清晰。乙個物件建立是有條件約束的,如乙個呼叫者需要乙個具體的產品物件,只要知道這個產品的類名(或約束字串)就可以了,不用知道建立物件的艱辛過程,減少模組間的耦合。

其次,工廠方法模式的擴充套件性非常優秀。在增加產品類的情況下,只要適當地修改具體的工廠類或擴充套件乙個工廠類,就可以完成「擁抱變化」。例如在我們的例子中,需要增加乙個棕色人種,則只需要增加乙個brownhuman類,工廠類不用任何修改就可完成系統擴充套件。

再次,遮蔽產品類。這一特點非常重要,產品類的實現如何變化,呼叫者都不需要關心,它只需要關心產品的介面,只要介面保持不表,系統中的上層模組就不要發生變化,因為產品類的例項化工作是由工廠類負責,乙個產品物件具體由哪乙個產品生成是由工廠類決定的。在資料庫開發中,大家應該能夠深刻體會到工廠方法模式的好處:如果使用jdbc連線資料庫,資料庫從mysql切換到oracle,需要改動地方就是切換一下驅動名稱(前提條件是sql語句是標準語句),其他的都不需要修改,這是工廠方法模式靈活性的乙個直接案例。

最後,工廠方法模式是典型的解耦框架。高層模組值需要知道產品的抽象類,其他的實現類都不用關心,符合迪公尺特原則,我不需要的就不要去交流;也符合依賴倒轉原則,只依賴產品類的抽象;當然也符合黎克特制替換原則,使用產品子類替換產品父類,沒問題!

工廠方法的使用場景

工廠方法模式是new乙個物件的替代品,所以在所有需要生成物件的地方都可以使用,但是需要慎重地考慮是否要增加乙個工廠類進行管理,增加**的複雜度。

在一些情況下使用工廠模式確實最合適的:

情況一:如果乙個物件擁有很多子類,那麼建立該物件的子類使用工廠模式是最合適的,不但可以面向介面的程式設計,為維護以及開發帶來方便。

情況二:如果建立某個物件時需要進行許多額外的操作,如查詢資料庫然後將查詢到的值賦予要建立的物件(單例初始化時使用比較多),或是需要許多額外的賦值等等。如果檢視jdk原始碼中,會發現許多成員變數在物件構造時,通過工廠方法進行建立的。因為這些成員變數本身的建立也很複雜。不可能建立物件時,在該物件的構造方法裡建立成員變數然後再賦值給該成員變數。而且使用工廠模式也提高了**的重用性。

簡單工廠模式

也叫做靜態工廠模式,就是將生產產品的方法設計為static靜態方法,並去掉抽象工廠類,缺點是擴充套件困難,不符合開閉原則。

多工廠模式

為每種產品的生產提供乙個工廠。如下例:

抽象工廠類:

public

abstract

class

abstracthumanfactory

黑人具體工廠類:

public

class blackhumanfactory extends

abstracthumanfactory

}

黃人具體工廠類:

public

class yellowhumanfactory extends

abstracthumanfactory

}

抽象產類以及各個產品類略。。

客戶端使用:

public

class

client

}

多工廠類的好處就是為每乙個產品都建立了相應的工廠類,職責清晰,結構簡單,但是缺點是,沒增加乙個產品類,就需要同時再建立乙個工廠類,對可維護性和擴充套件性帶來了一定影響。

ps.所有筆記摘自《設計模式之禪》。

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...

工廠方法模式 工廠方法模式 二

工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...

工廠方法模式(一) 簡單工廠方法模式

ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...