原創(chuàng)文章邪驮,轉(zhuǎn)載請(qǐng)標(biāo)注出處:《Java設(shè)計(jì)模式系列-工廠方法模式》
一候味、概述
工廠,就是生產(chǎn)產(chǎn)品的地方洪灯。
在Java設(shè)計(jì)模式中使用工廠的概念坎缭,那就是生成對(duì)象的地方了。
本來直接就能創(chuàng)建的對(duì)象為何要增加一個(gè)工廠類呢签钩?
這就需要了解工廠方法要解決的是什么問題了掏呼,如果只有一個(gè)類,我們直接new一個(gè)對(duì)象完事边臼,這是最簡(jiǎn)單的哄尔;但是如果有多個(gè)類呢假消,而且這些類還需要針對(duì)不同的情況來創(chuàng)建不同的對(duì)象柠并,這時(shí)候就需要工廠了,我們可以在工廠中根據(jù)條件來創(chuàng)建具體的對(duì)象。
這樣一來就將調(diào)用方和具體的目標(biāo)類進(jìn)行了解耦臼予,調(diào)用方根本就不知道需要?jiǎng)?chuàng)建那個(gè)對(duì)象鸣戴,它只是提出了條件,然后工廠就可以根據(jù)給定的條件來決定創(chuàng)建哪一個(gè)對(duì)象粘拾。
二窄锅、簡(jiǎn)單工廠方法模式
要說工廠方法模式,不得不先了解下簡(jiǎn)單工程方法模式缰雇,這個(gè)模式并不是23種設(shè)計(jì)模式中的內(nèi)容入偷。
所謂簡(jiǎn)單工廠方法模式,就是為目標(biāo)類創(chuàng)建一個(gè)工廠械哟,當(dāng)有多個(gè)目標(biāo)實(shí)現(xiàn)的時(shí)候疏之,在這個(gè)工廠內(nèi)部進(jìn)行邏輯判斷來根據(jù)條件創(chuàng)建不同的目標(biāo)實(shí)例。
下面看個(gè)例子暇咆,我就以桌子為例來寫:
桌子接口:Desk
/**
* 桌子接口
*/
public interface Desk {
String getType();
}
木質(zhì)桌子:WoodenDesk
/**
* 木質(zhì)桌子
*/
public class WoodenDesk implements Desk{
private String type = "木質(zhì)桌";
@Override
public String getType() {
return type;
}
}
塑料桌子:PlasticDesk
/**
* 塑料桌
*/
public class PlasticDesk implements Desk {
private String type = "塑料桌";
@Override
public String getType() {
return type;
}
}
類型枚舉:Type
/**
* 類型
*/
public enum Type {
PLASTIC,WOODEN;
}
桌子工廠:DeskFactory
/**
* 桌子工廠
*/
public class DeskFactory {
public static Desk createDesk(Type type) {
switch (type) {
case WOODEN:
return new WoodenDesk();
case PLASTIC:
return new PlasticDesk();
default:
return null;
}
}
}
測(cè)試類:Clienter
/**
* 測(cè)試類
*/
public class Clineter {
public static void main(String[] args) {
Desk desk = DeskFactory.createDesk(Type.PLASTIC);
System.out.println(desk.getType());
}
}
執(zhí)行結(jié)果
塑料桌
這就是簡(jiǎn)單工廠方法锋爪,只有一個(gè)工廠類來面向多個(gè)目標(biāo)實(shí)現(xiàn)。當(dāng)目標(biāo)實(shí)現(xiàn)增多時(shí)爸业,我們不得不去修改工廠類的方法其骄,使其兼容新的實(shí)現(xiàn)類型,這明顯違背了開閉原則扯旷,所以出現(xiàn)了工廠方法模式拯爽。
三、工廠方法模式
工廠方法模式是對(duì)簡(jiǎn)單工廠模式的抽象升級(jí)钧忽,將工廠這個(gè)概念抽象出來成為接口某抓,然后針對(duì)每種目標(biāo)實(shí)現(xiàn)類創(chuàng)建一個(gè)工廠實(shí)現(xiàn),一對(duì)一來實(shí)現(xiàn)惰瓜,當(dāng)新增了目標(biāo)實(shí)現(xiàn)否副,只要同時(shí)新增一個(gè)工廠實(shí)現(xiàn)即可。
下面看看實(shí)例:
桌子接口:Desk
/**
* 桌子接口
*/
public interface Desk {
String getType();
}
木質(zhì)桌子:WoodenDesk
/**
* 木質(zhì)桌子
*/
public class WoodenDesk implements Desk{
private String type = "木質(zhì)桌";
@Override
public String getType() {
return type;
}
}
塑料桌子:PlasticDesk
/**
* 塑料桌
*/
public class PlasticDesk implements Desk {
private String type = "塑料桌";
@Override
public String getType() {
return type;
}
}
桌子工廠接口:DeskFactory
/**
* 桌子工廠接口
*/
public interface DeskFactory {
Desk createDesk();
}
木質(zhì)桌子工廠:WoodenDeskFactory
/**
* 木質(zhì)桌子工廠
*/
public class WoodenDeskFactory implements DeskFactory{
@Override
public Desk createDesk(){
return new WoodenDesk();
}
}
塑料桌子工廠:
/**
* 塑料桌子工廠
*/
public class PlasticDeskFactory implements DeskFactory {
@Override
public Desk createDesk() {
return new PlasticDesk();
}
}
測(cè)試類:Clienter
/**
* 測(cè)試類
*/
public class Clienter {
public static void main(String[] args) {
DeskFactory factory = new WoodenDeskFactory();
Desk desk = factory.createDesk();
System.out.println(desk.getType());
}
}
執(zhí)行結(jié)果:
木質(zhì)桌
四崎坊、解析
從上面的實(shí)例中可以很容易看出來备禀,工廠方法模式的重點(diǎn)就在這個(gè)工廠接口了。
目標(biāo)可以無限擴(kuò)展奈揍,工廠類也要隨之?dāng)U展曲尸,一對(duì)一存在,滿足了開閉原則男翰,但如果目標(biāo)實(shí)現(xiàn)較多另患,工廠實(shí)現(xiàn)類也會(huì)增多,不簡(jiǎn)潔蛾绎。
MyBatis中使用的比較多昆箕,事務(wù)模塊和數(shù)據(jù)源模塊都使用了工廠方法模式鸦列。