簡(jiǎn)單工廠模式其實(shí)并不是一個(gè)設(shè)計(jì)模式沙绝,反而像是一種比較常用的編程習(xí)慣窄锅!他還有個(gè)名字叫靜態(tài)工廠方法(Static Factory Method)模式。
簡(jiǎn)單工廠模式應(yīng)該是工廠模式家族中最簡(jiǎn)單的一種模式,同時(shí)也是很常用的一種模式况凉。
我們一如既往的通過實(shí)際問題的模擬來學(xué)習(xí)簡(jiǎn)單工廠模式渠抹!
問題引出
假設(shè)我們要開一家披薩店撵溃,我們需要實(shí)現(xiàn)一個(gè)orderPizza的方法邢笙,根據(jù)不同的pizza種類。
大致代碼如下:
Pizza orderPizza(String type) {
Pizza pizza;
if(type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("greek")) {
pizza = new GreekPizza();
} else if (type.equals("cock")) {
pizza = new CockPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
其中這部分代碼都是在實(shí)現(xiàn)new一個(gè)pizza的工作腥寇,根據(jù)不同的種類
Pizza pizza;
if(type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("greek")) {
pizza = new GreekPizza();
} else if (type.equals("cock")) {
pizza = new CockPizza();
}
很顯然成翩,這樣是存在問題的,如果我們要增加一個(gè)pizza種類或者減少一個(gè)pizza種類赦役,我們就要重新修改orderPizza方法麻敌。無法實(shí)現(xiàn)對(duì)修改關(guān)閉。
同時(shí)掂摔,我們意識(shí)到术羔,new出一個(gè)pizza對(duì)象之后,我們之后所做的工作:
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
都是一致的乙漓!這一部分是不變的部分级历。所以我們考慮可以將變與不變的部分提取出來,達(dá)到封裝的目的叭披。
建立簡(jiǎn)單pizza工廠
我們將會(huì)變化的new對(duì)象的部分代碼提取出來寥殖,將其用另一個(gè)對(duì)象封裝起來,這個(gè)對(duì)象根據(jù)它的作用就是創(chuàng)建一個(gè)pizza,我們就稱其為factory也就是工廠嚼贡。
這樣的話熏纯,orderPizza方法就變成工廠對(duì)象的客戶,當(dāng)需要一個(gè)pizza對(duì)象時(shí)粤策,就像工廠對(duì)象請(qǐng)求做一個(gè)出來樟澜,這就是簡(jiǎn)單工廠的設(shè)計(jì)思想。
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if(type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("greek")) {
pizza = new GreekPizza();
} else if (type.equals("cock")) {
pizza = new CockPizza();
}
return pizza;
}
}
這樣就實(shí)現(xiàn)了簡(jiǎn)單工廠模式掐场,簡(jiǎn)單工廠對(duì)象可以同時(shí)為多個(gè)pizza店提供pizza往扔,所以當(dāng)出現(xiàn)變化時(shí)贩猎,我們只需要修改這個(gè)類即可熊户!
重構(gòu)PizzaStore類
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
Pizza orderPizza(String type) {
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
看看我們?cè)O(shè)計(jì)的簡(jiǎn)單工廠模式的類圖:
PizzaStore是工廠的客戶,他通過工廠對(duì)象取得pizza實(shí)例吭服,pizza是工廠對(duì)象的產(chǎn)品嚷堡,由工廠對(duì)象來完成實(shí)例化pizza實(shí)例的工作。
小結(jié)
簡(jiǎn)單工廠模式嚴(yán)格的說不是一種設(shè)計(jì)模式艇棕,而是一種編程習(xí)慣蝌戒,他的核心思想就是,將會(huì)發(fā)生變化的實(shí)例化代碼抽離出來沼琉,新建一個(gè)簡(jiǎn)單工廠類將其封裝起來北苟!