設(shè)計(jì)模式 -- 工廠模式
工廠模式
1. 什么是工廠模式
工廠模式屬于創(chuàng)建對(duì)象的模式翔脱。將對(duì)象的創(chuàng)建交給工廠進(jìn)行,這樣我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端直接暴露創(chuàng)建邏輯,而是 通過(guò)使用一個(gè)共同的接口根據(jù)不同的條件來(lái)指向具體想要?jiǎng)?chuàng)建的對(duì)象克蚂。
最明顯的就是降低了對(duì)象之間的耦合問(wèn)題。spring 中的 ioc 就采用了工廠模式來(lái)創(chuàng)建對(duì)象座慰。
2. 對(duì)比
這里通過(guò)傳統(tǒng)開發(fā)和使用工廠模式做個(gè)對(duì)比:
創(chuàng)建一個(gè)接口:
public interface UserService {
public void sayHello();
}
創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類:
public class UserServiceImpl implements UserService {
public void sayHello() {
System.out.println("hello wolrd");
}
}
傳統(tǒng)開發(fā)
那么我們?nèi)绾潍@得該實(shí)體類的對(duì)象呢陨舱,最簡(jiǎn)單的就是 new 一個(gè) UserServiceImpl 對(duì)象:
客戶端代碼如下:
public class Test {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.sayHello();
}
}
這里 Test 類和 UserServiceImpl 類就存在耦合翠拣,如果需要添加新功能(如 UserServiceImpl 類中添加屬性或增加新的類)版仔,那么我們的客戶端類就需要修改原來(lái)的類或者 new 新類。 如果實(shí)現(xiàn)的功能很多误墓,就相當(dāng)于我們將很多工作裝入一個(gè)方法中蛮粮,相當(dāng)于將很多雞蛋放在一個(gè)籃子里,這樣是很危險(xiǎn)的谜慌,如果將來(lái)代碼量大了然想,非常不利于我們維護(hù)。
我們寫代碼的時(shí)候應(yīng)該遵循 OCP原則
OCP原則:open-close 原則欣范,對(duì)程序擴(kuò)展是 open 的变泄,對(duì)修改程序代碼是 close。
盡量做到不修改程序的源碼恼琼,實(shí)現(xiàn)對(duì)程序的擴(kuò)展妨蛹。
工廠模式開發(fā)
如果我們這里創(chuàng)建 Factory 類來(lái)創(chuàng)建對(duì)象,提供接口給 Test 類調(diào)用晴竞,這樣耦合關(guān)系雖然變成了 Test 類和 Factory類蛙卤,F(xiàn)actory類和 UserServiceImpl 類,但 Test類 和 UserServiceImpl 就不存在耦合了噩死。以后我們需要擴(kuò)展功能就直接在工廠類中創(chuàng)建好對(duì)象颤难,再讓客戶端類調(diào)用就行了。
創(chuàng)建一個(gè)工廠已维,生成基于給定信息的實(shí)體類的對(duì)象行嗤。:
public class Factory() {
// 使用 getUs 方法來(lái)獲得 UserServiceImpl 對(duì)象
public UserService getUs() {
return new UserServiceImpl();
}
}
使用該工廠,通過(guò)傳遞類型信息來(lái)獲取實(shí)體類的對(duì)象:
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
//獲得 UserServiceImpl 的對(duì)象垛耳,并調(diào)用它的 sayHello 方法
UserService userService = factory.getUs();
userService.sayHello();
}
}
這樣,在整個(gè)就不涉及到 UserService 的具體的實(shí)現(xiàn)類栅屏,達(dá)到封裝效果,也就減少錯(cuò)誤修改的機(jī)會(huì)。
總結(jié)
使用工廠模式將對(duì)象的創(chuàng)建交給工廠類進(jìn)行艾扮,很好的降低了代碼的耦合度既琴,提供接口給實(shí)現(xiàn)方調(diào)用,增加了程序的可擴(kuò)展性泡嘴。
具體步驟:
- 定義產(chǎn)品接口
- 繼承接口創(chuàng)建實(shí)現(xiàn)類
- 創(chuàng)建工廠類甫恩,使用工廠創(chuàng)建對(duì)象
- 通過(guò) new 工廠類,調(diào)用工廠類中創(chuàng)建的實(shí)例的方法酌予,實(shí)現(xiàn)相關(guān)功能