1.前言
還記得建造者模式嗎粱坤?通過一步步的設(shè)置濒旦,或者實現(xiàn)不同的Builder類可以創(chuàng)建出不同的對象梯嗽。但是显晶,擴展性仍覺得不夠壹士,要么設(shè)置屬性的操作空間很小躏救,要么必須得按流程辦事苞慢。所以希望有一種設(shè)計模式能夠更加自由地創(chuàng)建對象辑畦,對外是統(tǒng)一的調(diào)用方法,對內(nèi)則提供的對象可以獨立地構(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)工廠模式霜威。開始對上面的代碼進行改造:
// 通過傳入的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)性增強。傳入的產(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)品,如何按需組合共啃?下一篇抽象工廠模式占调,將會探討這個問題。