1.前言
還記得建造者模式嗎?通過一步步的設(shè)置,或者實現(xiàn)不同的Builder類可以創(chuàng)建出不同的對象。但是,擴(kuò)展性仍覺得不夠,要么設(shè)置屬性的操作空間很小,要么必須得按流程辦事。所以希望有一種設(shè)計模式能夠更加自由地創(chuàng)建對象,對外是統(tǒng)一的調(diào)用方法,對內(nèi)則提供的對象可以獨(dú)立地構(gòu)造。
2.概念
工廠方法模式要求定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪個類。還記得依賴倒置原則嗎?不記得可以看這里。依賴倒置可以將代碼的具體實現(xiàn)封裝起來,對調(diào)用者隱藏內(nèi)部操作,降低了彼此之間的耦合度,使業(yè)務(wù)邏輯產(chǎn)生的變化只會影響實現(xiàn)類。而工廠方法模式完全符合這項原則。
3.場景
工廠要生產(chǎn)兩種油性筆,根據(jù)使用的材料分為高端金屬外殼和大眾塑料外殼。要注意的是,筆具有寫的功能,而工廠具有生產(chǎn)的功能。
4.寫法
第一步,聲明產(chǎn)品和工廠的操作規(guī)范,方便客戶使用。
public interface Pen {
void write();
}
public interface Factory {
Pen produce();
}
第二步,分別實現(xiàn)兩種產(chǎn)品及生產(chǎn)產(chǎn)品的工廠。
public class MetalPen implements Pen {
@Override
public void write() {
System.out.println("我是高端金屬筆");
}
}
public class PlasticPen implements Pen {
@Override
public void write() {
System.out.println("我是大眾塑料筆");
}
}
public class MetalFactory implements Factory {
@Override
public Pen produce() {
return new MetalPen();
}
}
public class PlasticFactory implements Factory {
@Override
public Pen produce() {
return new PlasticPen();
}
}
第三步,客戶通知工廠開始生產(chǎn)。
public class Client {
public static void main(String[] args) {
new MetalFactory().produce().write();;
new PlasticFactory().produce().write();
}
}
以上就是最常用的工廠方法模式,稱為多工廠方法模式。當(dāng)需要增加一種產(chǎn)品時,只需要實現(xiàn)對應(yīng)的產(chǎn)品類和工廠類即可,非常方便。若因需修改產(chǎn)品時,僅修改對應(yīng)的產(chǎn)品類即可。
細(xì)心的你發(fā)現(xiàn)了沒有,若產(chǎn)品數(shù)量一直增加下去,那豈不是要造一堆工廠,不符合實際呀。最好的辦法是,同一個工廠根據(jù)不同的設(shè)計圖生產(chǎn)不同的筆。所以引入另一種工廠方法模式,叫簡單工廠模式或者靜態(tài)工廠模式。開始對上面的代碼進(jìn)行改造:
// 通過傳入的Class類和反射決定生產(chǎn)的產(chǎn)品
public class Factory {
public static <T extends Pen> T produce(Class<T> clz) {
Pen pen = null;
try {
pen = (Pen) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) pen;
}
}
public class Client {
public static void main(String[] args) {
// 讓我生產(chǎn)啥就生產(chǎn)
Factory.produce(MetalPen.class).write();
Factory.produce(PlasticPen.class).write();
}
}
現(xiàn)在的代碼,比原來的少了一層工廠抽象,更加簡潔,而且動態(tài)性增強(qiáng)。傳入的產(chǎn)品類相當(dāng)于圖紙,更符合現(xiàn)實生活中的情況。
5.總結(jié)
工廠方法模式是一個很好的設(shè)計模式,結(jié)構(gòu)清晰,有效地封裝變化。但是會增加代碼層級,引入較多的類,所以用new就可以創(chuàng)建的對象無需使用工廠方法模式。這里提供的產(chǎn)品是完整的對象,細(xì)節(jié)在構(gòu)造函數(shù)中封裝,那么若工廠是生產(chǎn)零部件,由用戶自己組裝時,又會如何呢?不同工廠生產(chǎn)不同的產(chǎn)品,同一個工廠生產(chǎn)不同檔次的產(chǎn)品,如何按需組合?下一篇抽象工廠模式,將會探討這個問題。