個人博客原文:
創(chuàng)建型模式:抽象工廠
五大創(chuàng)建型模式之三:抽象工廠。
簡介
姓名 :抽象工廠
英文名 :Abstract Factory Pattern
價值觀 :不管你有多少產(chǎn)品章咧,給我就是了
個人介紹 :
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
為創(chuàng)建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類。
(來自《設計模式之禪》)
今天講的是抽象工廠模式恢暖,小伙伴可能有疑問,抽象工廠和工廠方法之間都有工廠,那肯定是有什么聯(lián)系的陡蝇,具體是什么關系呢?簡單的說:工廠方法是在解決一個產(chǎn)品多個層級方面的事情哮肚;而抽象工廠致力于解決多個產(chǎn)品多個層級方面的事情登夫。舉個例子:汽車是由很多零件組成的,比如引擎允趟、輪胎恼策、方向盤等等。現(xiàn)在如果我們是輪胎生產(chǎn)方潮剪,要生產(chǎn)寶馬輪胎和奔馳輪胎涣楷,要用工廠方法還是抽象工廠實現(xiàn)呢?答案是:工廠方法抗碰。輪胎是一個產(chǎn)品狮斗,寶馬輪胎和奔馳輪胎是 2 個不同層級的輪胎,所以用工廠方法解決就足夠改含。假如現(xiàn)在我們是汽車生產(chǎn)方情龄,要生產(chǎn)寶馬汽車和奔馳汽車,汽車又包含輪胎和方向盤等等捍壤,要用哪個來實現(xiàn)?既然是上面的是工廠方法鞍爱,那這個就用抽象工廠鹃觉,因為這涉及到多個產(chǎn)品(輪胎、方向盤等等)和 2 個層級(寶馬和奔馳)睹逃。這里還沒有講抽象工廠的概念就說了工廠方法和抽象方法的區(qū)別盗扇,是不是有點陌生祷肯?嗯,先記住這個概念疗隶,分清楚兩者的區(qū)別佑笋。在不同場景使用不同的設計模式。
上面定義中:為創(chuàng)建一組相關或相互依賴的對象提供一個接口斑鼻。這樣子理解這句話蒋纬,比如上面說的輪胎和方向盤,寶馬汽車用的輪胎和方向盤需要都是寶馬品牌的坚弱,也就是說在安裝寶馬汽車的輪胎和方向盤的時候蜀备,得用寶馬生產(chǎn)的輪胎和方向盤,重要的一點是:輪胎和方向盤是互相依賴的荒叶,不能在寶馬汽車上安裝奔馳輪胎和寶馬方向盤碾阁,因為有這個依賴關系,所以我們需要提供一個額外的接口些楣,來保證寶馬汽車使用的輪胎和方向盤都是寶馬生產(chǎn)的脂凶。這就是抽象工廠干的事情。
你要的故事
上面用汽車安裝輪胎和方向盤的例子愁茁,那這里為了讓大家能深入理解蚕钦,就不用其他例子了。在一個設計模式講解的過程中埋市,我覺得用一個案例來講解可以減少讀者的閱讀理解成本冠桃,為了寫設計模式這一系列文章,看了不少設計模式方面的書籍道宅,有些書籍在講解一個設計模式的時候食听,用了不止一個例子,讀完之后印象不是很深刻污茵。這個系列寫完之后樱报,想要的效果是:不需要記住設計模式的定義,把這些故事以及故事對應是講哪個設計模式都記住了泞当,就真正掌握了這些內(nèi)容了迹蛤。
public class AbstractFactoryTest {
public static void main(String[] args) {
// 寶馬員工安裝輪胎和方向盤
AbstractCarFactory bmwCarFacatory = new BMWCarFactory();
bmwCarFacatory.installWheel();
bmwCarFacatory.installSteeringWheel();
// 奔馳員工安裝輪胎和方向盤
AbstractCarFactory mercedesCarFacatory = new MercedesCarFacatory();
mercedesCarFacatory.installWheel();
mercedesCarFacatory.installSteeringWheel();
}
}
/**
* 汽車抽象工廠
*/
interface AbstractCarFactory {
void installWheel();
void installSteeringWheel();
}
/**
* 寶馬工廠
*/
class BMWCarFactory implements AbstractCarFactory {
@Override
public void installWheel() {
WheelFacatory wheelFacatory = new BMWWheelFacatory();
String wheel = wheelFacatory.createWheel();
System.out.println("安裝輪胎:" + wheel);
}
@Override
public void installSteeringWheel() {
SteeringWheelFacatory steeringWheelFacatory = new BMWSteeringWheelFacatory();
String steeringWheel = steeringWheelFacatory.createSteeringWheel();
System.out.println("安裝方向盤:" + steeringWheel);
}
}
/**
* 奔馳工廠
*/
class MercedesCarFacatory implements AbstractCarFactory {
@Override
public void installWheel() {
WheelFacatory wheelFacatory = new MercedesWheelFacatory();
String wheel = wheelFacatory.createWheel();
System.out.println("安裝輪胎:" + wheel);
}
@Override
public void installSteeringWheel() {
SteeringWheelFacatory steeringWheelFacatory = new MercedesSteeringWheelFacatory();
String steeringWheel = steeringWheelFacatory.createSteeringWheel();
System.out.println("安裝方向盤:" + steeringWheel);
}
}
/**
* 輪胎工廠
*/
interface WheelFacatory {
String createWheel();
}
/**
* 寶馬輪胎工廠
*/
class BMWWheelFacatory implements WheelFacatory {
@Override
public String createWheel() {
System.out.println("寶馬輪胎工廠生產(chǎn)輪胎");
return "寶馬輪胎";
}
}
/**
* 奔馳輪胎工廠
*/
class MercedesWheelFacatory implements WheelFacatory {
@Override
public String createWheel() {
System.out.println("奔馳輪胎工廠生產(chǎn)輪胎");
return "奔馳輪胎";
}
}
/**
* 方向盤工廠
*/
interface SteeringWheelFacatory {
String createSteeringWheel();
}
/**
* 寶馬方向盤工廠
*/
class BMWSteeringWheelFacatory implements SteeringWheelFacatory {
@Override
public String createSteeringWheel() {
System.out.println("寶馬方向盤工廠生產(chǎn)方向盤");
return "寶馬方向盤";
}
}
/**
* 奔馳方向盤工廠
*/
class MercedesSteeringWheelFacatory implements SteeringWheelFacatory {
@Override
public String createSteeringWheel() {
System.out.println("奔馳方向盤工廠生產(chǎn)方向盤");
return "奔馳方向盤";
}
}
代碼:
還是和以往一樣,思維開拓一下襟士,這里列舉的是給汽車安裝輪胎和方向盤盗飒,汽車不止這些,如果要加個安裝引擎呢陋桂?要怎么實現(xiàn)逆趣?這里我就不寫出來了,讓小伙伴嘗試一下嗜历,寫出來了就理解抽象模式這個設計模式啦宣渗。
總結
簡單工廠抖所、工廠方法、抽象工廠這幾個工廠相關的設計模式的基本內(nèi)容都講完了痕囱,這幾個模式都是為了解耦田轧,為了可擴展。這里要著重說一下鞍恢,三者之間沒有好壞之分傻粘,只有在具體的場景才能發(fā)揮它們各自的優(yōu)勢。在單產(chǎn)品多層級有序,層級數(shù)量不多的情況下抹腿,可以使用簡單工廠,層級多且需要支持擴展旭寿,可以使用工廠方法警绩;在多產(chǎn)品多層級,可以使用抽象工廠盅称。
參考資料:《大話設計模式》肩祥、《Java設計模式》、《設計模式之禪》缩膝、《研磨設計模式》混狠、《Head First 設計模式》
推薦閱讀:
創(chuàng)建型模式:單例模式
創(chuàng)建型模式:工廠方法
希望文章對您有所幫助,設計模式系列會持續(xù)更新疾层,感興趣的同學可以關注公眾號将饺,第一時間獲取文章推送閱讀,也可以一起交流痛黎,交個朋友予弧。