1傍妒、定義
工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計(jì)模式,此模式的核心精神是封裝類中變化的部分,提取其中個(gè)性化善變的部分為獨(dú)立類既忆,通過(guò)依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的患雇。它的核心結(jié)構(gòu)有四個(gè)角色宇挫,分別是抽象工廠;具體工廠器瘪;抽象產(chǎn)品;具體產(chǎn)品
2援所、模式簡(jiǎn)介
工廠方法(Factory Method)模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口欣除,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建滔岳,這樣核心類成為一個(gè)抽象工廠角色挽牢,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。
工廠方法模式是簡(jiǎn)單工廠模式的衍生睹簇,解決了許多簡(jiǎn)單工廠模式的問(wèn)題太惠。首先完全實(shí)現(xiàn)‘開(kāi)-閉 原則’,實(shí)現(xiàn)了可擴(kuò)展凿渊。其次更復(fù)雜的層次結(jié)構(gòu)缚柳,可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場(chǎng)合秋忙。
工廠方法模式對(duì)簡(jiǎn)單工廠模式進(jìn)行了抽象构舟。有一個(gè)抽象的Factory類(可以是抽象類和接口),這個(gè)類將不再負(fù)責(zé)具體的產(chǎn)品生產(chǎn)弹澎,而是只制定一些規(guī)范努咐,具體的生產(chǎn)工作由其子類去完成。在這個(gè)模式中佩迟,工廠類和產(chǎn)品類往往可以依次對(duì)應(yīng)免胃。即一個(gè)抽象工廠對(duì)應(yīng)一個(gè)抽象產(chǎn)品,一個(gè)具體工廠對(duì)應(yīng)一個(gè)具體產(chǎn)品羔沙,這個(gè)具體的工廠就負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的產(chǎn)品扼雏。
工廠方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)應(yīng)用。
3诗充、角色結(jié)構(gòu)
抽象工廠(Creator)角色
是工廠方法模式的核心,與應(yīng)用程序無(wú)關(guān)碟绑。任何在模式中創(chuàng)建的對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口格仲。
具體工廠(Concrete Creator)角色
這是實(shí)現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯凯肋,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象汽馋。
抽象產(chǎn)品(Product)角色
工廠方法模式所創(chuàng)建的對(duì)象的超類型圈盔,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口
具體產(chǎn)品(Concrete Product)角色
這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口驱敲。某具體產(chǎn)品有專門(mén)的具體工廠創(chuàng)建癌佩,它們之間往往一一對(duì)應(yīng)。
4围辙、模式應(yīng)用
工廠方法經(jīng)常用在以下兩種情況中:
第一種情況是對(duì)于某個(gè)產(chǎn)品放案,調(diào)用者清楚地知道應(yīng)該使用哪個(gè)具體工廠服務(wù),實(shí)例化該具體工廠吱殉,生產(chǎn)出具體的產(chǎn)品來(lái)。Java Collection中的iterator() 方法即屬于這種情況友雳。
第二種情況,只是需要一種產(chǎn)品押赊,而不想知道也不需要知道究竟是哪個(gè)工廠為生產(chǎn)的饺藤,即最終選用哪個(gè)具體工廠的決定權(quán)在生產(chǎn)者一方,它們根據(jù)當(dāng)前系統(tǒng)的情況來(lái)實(shí)例化一個(gè)具體的工廠返回給使用者流礁,而這個(gè)決策過(guò)程這對(duì)于使用者來(lái)說(shuō)是透明的涕俗。
--以上概念摘抄自百度百科,方便自己學(xué)習(xí)--
-----------------------------------------------------------------------------------
--開(kāi)始自己擼--
5神帅、實(shí)例講解
背景:比如說(shuō)我現(xiàn)在有這么個(gè)需求再姑,就是我要對(duì)面粉進(jìn)行加工,從而得到饅頭找御、掛面
首先我需要抽象產(chǎn)品(Product)角色
/**
* 首先無(wú)論是做饅頭還是掛面元镀,他們都有一個(gè)加工方法,可以抽象出來(lái)
* Machine:機(jī)器
*/
public interface MachineApi {
//process:加工 material:材料
public void process(String material);
}
然后我需要拿到具體產(chǎn)品
/**
* 饅頭機(jī)器
* steamed bun : 饅頭
*/
public class SteamedBunMachine implements MachineApi {
@Override
public void process(String material) {
System.out.println("我把" + material + "加工成了饅頭");
}
}
/**
* 面條機(jī)器
* noodle : 面條
*/
public class BoodleMachine implements MachineApi {
@Override
public void process(String material) {
System.out.println("我把" + material + "加工成了面條");
}
}
這個(gè)時(shí)候我需要一個(gè) 抽象工廠角色
public abstract class Factory{
/**
* 讓子類(具體工廠)來(lái)實(shí)例化具體對(duì)象(機(jī)器)
*/
public abstract MachineApi newMachine();
/**
* 加工材料
*/
public void process(String material){
MachineApi machine = newMachine();
machine.process(material);
}
}
然后我需要兩家工廠霎桅,分別幫我生成饅頭和面條
//饅頭工廠
public class SteamedBunFactory extends Factory{
//饅頭工廠栖疑,只需要提供饅頭機(jī)器就行
@Override
public MachineApi newMachine() {
return new SteamedBunMachine();
}
}
//面條工廠
public class NoodleFactory extends Factory{
//面條工廠,只需要提供面條機(jī)器就行
@Override
public MachineApi newMachine() {
return new BoodleMachine();
}
}
最后我作為老板哆档,只需要操作工廠就可以進(jìn)行生成
SteamedBunFactory mSteamedBunFactory = new SteamedBunFactory ();
mSteamedBunFactory.process("面粉");//我把面粉加工成了饅頭
總結(jié)
其實(shí)這個(gè)時(shí)候瓜浸,我作為老板插佛,我又想開(kāi)一家餅干廠,那么我只需要弄一臺(tái)餅干機(jī)器(繼承機(jī)器)氢拥,再弄一個(gè)餅干廠(繼承工廠)就可以了嫩海,根本不需要?jiǎng)又暗拇a叁怪,這個(gè)過(guò)程唯一變化的就是做饅頭和做面條的流程工藝不同,提取其中個(gè)性化善變的部分為獨(dú)立類血柳,通過(guò)依賴注入以達(dá)到解耦难捌、復(fù)用和方便后期維護(hù)拓展的目的栖榨。
版權(quán)聲明:個(gè)人原創(chuàng),若轉(zhuǎn)載愚争,請(qǐng)注明出處