1.前言
還記得上篇文章留下的疑問嗎?這里涉及到對(duì)象族的概念脯丝。對(duì)象族指不同類型的對(duì)象卻在邏輯上緊密相關(guān)組成整體燎含。不同類型的對(duì)象指不同的零部件,是對(duì)不同產(chǎn)品接口的實(shí)現(xiàn)军援。而邏輯上緊密相關(guān)指同一檔次的零部件相互組合仅淑,共同構(gòu)成一個(gè)完整的“大”產(chǎn)品。當(dāng)業(yè)務(wù)上涉及到對(duì)象族時(shí)胸哥,就用抽象工廠模式涯竟;若僅僅一種對(duì)象,便使用工廠方法模式空厌。
2.概念
抽象工廠模式為創(chuàng)建一組相關(guān)或者是相互依賴的對(duì)象提供一個(gè)接口庐船,而不需要指定它們的具體類。一個(gè)接口提供多個(gè)對(duì)象嘲更,說明工廠接口中聲明了創(chuàng)建多個(gè)不同種類產(chǎn)品的方法醉鳖;不需要具體類,說明返回的不是實(shí)現(xiàn)類而是接口哮内,那么得定義相應(yīng)產(chǎn)品的接口盗棵。與工廠方法模式一比較,發(fā)現(xiàn)對(duì)同一產(chǎn)品接口實(shí)現(xiàn)幾次北发,就有幾個(gè)對(duì)象族纹因;有幾種產(chǎn)品接口,就有幾個(gè)等級(jí)結(jié)構(gòu)琳拨。
3.場景
商店要組裝兩種油性筆瞭恰,根據(jù)使用材料分為高端金屬外殼和大眾塑料外殼,筆分為筆帽和筆身狱庇。由金屬廠生產(chǎn)金屬筆帽和金屬筆身惊畏,塑料廠生產(chǎn)塑料筆帽和塑料筆身恶耽。商店最后將同種材料的部件組裝銷售。注意颜启,金屬筆帽只能配金屬筆身偷俭,塑料筆帽只能配塑料筆身,不能混搭缰盏,這就是約束規(guī)則涌萤。同一約束規(guī)則便是一個(gè)對(duì)象族(現(xiàn)在叫產(chǎn)品族更合適)。
4.寫法
第一步口猜,聲明筆帽负溪、筆身和工廠的操作規(guī)范,方便商店調(diào)用济炎。
public interface Hat {
void show();
}
public interface Body {
void show();
}
public interface Factory {
Hat createHat();
Body createBody();
}
第二步川抡,分別完成兩類產(chǎn)品下兩個(gè)規(guī)格的實(shí)現(xiàn),以及生產(chǎn)產(chǎn)品的工廠须尚。
public class MetalHat implements Hat {
@Override
public void show() {
System.out.println("我是金屬筆帽");
}
}
public class PlasticHat implements Hat {
@Override
public void show() {
System.out.println("我是塑料筆帽");
}
}
public class MetalBody implements Body {
@Override
public void show() {
System.out.println("我是金屬筆身");
}
}
public class PlasticBody implements Body {
@Override
public void show() {
System.out.println("我是塑料筆身");
}
}
public class MetalFactory implements Factory {
@Override
public Hat createHat() {
return new MetalHat();
}
@Override
public Body createBody() {
return new MetalBody();
}
}
public class PlasticFactory implements Factory {
@Override
public Hat createHat() {
return new PlasticHat();
}
@Override
public Body createBody() {
return new PlasticBody();
}
}
第三步猖腕,商店通知工廠開始生產(chǎn),并拿到零部件組裝恨闪。
// 組裝成的商品
public class Pen {
private Hat mHat;
private Body mBody;
public Pen(Hat mHat, Body mBody) {
super();
this.mHat = mHat;
this.mBody = mBody;
}
public void show() {
mHat.show();
mBody.show();
}
}
public class Company {
public static void main(String[] args) {
Factory metalFactory = new MetalFactory();
new Pen(metalFactory.createHat(), metalFactory.createBody()).show();
Factory plasticFactory = new PlasticFactory();
new Pen(plasticFactory.createHat(), plasticFactory.createBody()).show();
}
}
到此倘感,有沒有發(fā)現(xiàn)與多工廠方法模式很像,除了接口和類多了點(diǎn)咙咽,所以說老玛,抽象工廠模式是多工廠方法模式的升級(jí)版。對(duì)于商店而言钧敞,很好地實(shí)現(xiàn)了迪米特原則蜡豹。商店只關(guān)心工廠的生產(chǎn)和筆的組裝,對(duì)于筆帽和筆身則由工廠和筆關(guān)心溉苛,降低了復(fù)雜對(duì)象創(chuàng)建時(shí)的耦合情況镜廉。
5.總結(jié)
抽象工廠模式也可以算是工廠方法模式,工廠方法模式具有的特性抽象工廠模式都有愚战。調(diào)用者是面向接口編程娇唯,所以對(duì)象創(chuàng)建的改變更加靈活、容易寂玲。當(dāng)然塔插,缺點(diǎn)更加明顯。接口和類增加太多拓哟;每增加一個(gè)零部件想许,工廠相關(guān)的對(duì)象都得改。