設(shè)計(jì)模式之工廠模式
標(biāo)簽(空格分隔): 設(shè)計(jì)模式 工廠模式
- 設(shè)計(jì)模式的感念
- 設(shè)計(jì)模式的應(yīng)用
- 工廠設(shè)計(jì)模式的產(chǎn)生
- 工廠設(shè)計(jì)模式的分類
設(shè)計(jì)模式的概念
所有的事物都是發(fā)展演變而來,萬物都是按照這個(gè)規(guī)律發(fā)展起來的,就拿編程來說,從開始的機(jī)器語(yǔ)言
匯編語(yǔ)言到C語(yǔ)言到c++javapython ..等等都是不斷的進(jìn)化而來。那么今天所談的主題設(shè)計(jì)模式也是這發(fā)展而來的,其實(shí)設(shè)計(jì)模式最初是應(yīng)用在建筑方面的,最后才演變到各行各業(yè)。
言歸正傳,什么是設(shè)計(jì)模式?設(shè)計(jì)模式就是某一類問題在特定環(huán)境下的一種解決方案。
設(shè)計(jì)模式的應(yīng)用
設(shè)計(jì)模式在程序設(shè)計(jì)中應(yīng)用的比較廣泛,比如 開源框架Spring中大量用到了工廠模式,也是本文所說的主要內(nèi)容。再有就是Java語(yǔ)言本身IO處理類中所用給到的裝飾模式,其實(shí)我們經(jīng)常也在用這些設(shè)計(jì)模式,只是你不曾發(fā)覺而已,那么為什么要用這些設(shè)計(jì)模式呢? 這個(gè)問題就回到了設(shè)計(jì)模式的感念,這樣來反問一下自己,就不難理解設(shè)計(jì)模式的用途了。其實(shí)就是為了解決問題而出現(xiàn)的一系列的解決方案,并且這些解決方案在處理此類問題的時(shí)候非常的有效。PS:你可以嘗試著不用設(shè)計(jì)模式來查看一下Spring的源碼。你會(huì)有意外的發(fā)現(xiàn)的。
工廠模式的產(chǎn)生
工廠模式產(chǎn)生其實(shí)好比顯示社會(huì)中的工廠,可以反思一下,社會(huì)中為什么需要這些工程,如果沒有了這些工廠會(huì)怎么樣?因?yàn)槲覀兲幱谠谝呀?jīng)發(fā)展的十分發(fā)達(dá)的社會(huì)環(huán)境下,那么我們需要逆推一下這個(gè)過程,如果沒有工廠的存在,假如你需要一個(gè)
自行車那么你改怎么辦呢? 首先你需要自己煉鐵->打鐵->制作輪子 ....等等一些列的東西都需要你去造出來。對(duì)的,就是這樣的。好吧,想想就是一件可怕的事情。其實(shí)這是一種思維方式 ,同時(shí)也是一種學(xué)習(xí)的方式,學(xué)會(huì)假設(shè)不存在某樣?xùn)|西會(huì)怎么樣,然后作用就變得非常清晰了。
工廠模式的分類
- 簡(jiǎn)單工廠模式
SimpleFactory - 抽象工廠模式
abstractFactory
簡(jiǎn)單工廠模式
何為簡(jiǎn)單工廠模式 : 不是所有的工廠都是全能的工廠,也就是我們社會(huì)中的一些小的加工廠,比方說 你附近的鐵匠鋪,他們只能生產(chǎn)出簡(jiǎn)單而單一的東西。
舉個(gè)例子
計(jì)算器中的加減乘除 我們用簡(jiǎn)單工廠模式來實(shí)現(xiàn)的話 代碼如下
從代碼中可以看出OperationFactory 只能構(gòu)造出特定的 + - * / 這幾個(gè)操作符,試想一下 如果你要求余數(shù)呢?該怎么辦? 辦法有很多 可以直接在switch case 中再追加一條。如果沒有源代碼的情況下該怎么辦呢?那么,就是下面要說的AbstractFactory
OperationFactory
public class OperationFactory {
public static Operation createOperation(String operationCode) {
Operation operation = null;
switch (operationCode) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
default:
operation = new OperationAdd();
break;
}
return operation;
}
Operation
public interface Operation {
int computer(int x, int y);
}
Operation相關(guān)子類
public class OperationAdd implements Operation {
@Override
public int computer(int x, int y) {
return x+y;
}
}
public class OperationDiv implements Operation{
@Override
public int computer(int x, int y) {
return x/y;
}
}
public class OperationMul implements Operation {
@Override
public int computer(int x, int y) {
return x * y ;
}
}
public class OperationSub implements Operation{
@Override
public int computer(int x, int y) {
return x - y;
}
}
抽象工廠模式 AbstractFactory
之所以未出現(xiàn)抽象工廠模式,是因?yàn)楹?jiǎn)單工廠模式滿足不了需求,當(dāng)前的需求是需要靈活的擴(kuò)展,也就是說我需要啥都可以去生產(chǎn),如果之前沒有對(duì)應(yīng)的生產(chǎn)方案,我可以增加生產(chǎn)方案只需要增加一條生產(chǎn)鏈而非重新去建立一個(gè)工廠。在代碼中,如果在沒有源碼的情況下,需要對(duì)依賴的源碼做擴(kuò)展,那么不用把依賴中的實(shí)現(xiàn)重現(xiàn)實(shí)現(xiàn)一遍,只需繼承或者實(shí)現(xiàn)源碼里面的某個(gè)類就可以簡(jiǎn)單的做到擴(kuò)展。
說的再多,不如一個(gè)例子可以清晰的展現(xiàn)。在開發(fā)過程中我們經(jīng)常會(huì)遇到支付相關(guān)的東西,比如:支付寶,微信,銀聯(lián)....很多支付。我們考慮設(shè)計(jì)一個(gè)PayFactory的工程,根據(jù)客戶的選擇來采用不用的支付工具。
代碼如下
Pay相關(guān)
public abstract class Pay {
public abstract String pay();
}
public class AliPay extends Pay {
@Override
public String pay() {
return "支付寶支付";
}
}
public class WXPay extends Pay {
@Override
public String pay() {
return "微信支付";
}
}
PayFactory相關(guān)
public abstract class PayFactory {
public abstract Pay createAliPay();
public abstract Pay createWxPay();
}
public class DefaultPayFactory extends PayFactory {
@Override
public Pay createAliPay() {
return new AliPay();
}
@Override
public Pay createWxPay() {
return new WXPay();
}
}
如果你需要擴(kuò)展一個(gè)雙錢的錢多多支付,你需要怎么做呢?代碼如下
定制Pay相關(guān)
public class QddPay extends Pay {
@Override
public String pay() {
return "雙錢支付";
}
}
實(shí)現(xiàn)PayFactory相關(guān)
public class CustomPayFactory extends DefaultPayFactory {
@Override
public Pay createAliPay() {
return super.createAliPay();
}
@Override
public Pay createWxPay() {
return super.createWxPay();
}
public Pay createQddPay() {
return new QddPay();
}
}
總結(jié)以上,可以見得工廠模式的作用,以上代碼可以自行運(yùn)行測(cè)試。祝大家學(xué)習(xí)順利