原創(chuàng)文章裹芝,轉(zhuǎn)載請標(biāo)注出處:《Java設(shè)計(jì)模式系列-抽象工廠模式》
一坝橡、概述
抽象工廠模式是對(duì)工廠方法模式的再升級(jí)方仿,但是二者面對(duì)的場景稍顯差別。
工廠方法模式面對(duì)的目標(biāo)一般都是單類的藏澳,就比如《Java設(shè)計(jì)模式系列-工廠方法模式》中所舉的例子仁锯,目標(biāo)就是桌子這一類商品。
如果是這樣的呢:生產(chǎn)的是桌椅組合翔悠,目標(biāo)的一套商品业崖,每一套商品中的每類商品的種類的不同的,不同的組合形成不同的套裝蓄愁。
這種情況下双炕,就需要使用抽象工廠模式
二、實(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;
}
}
椅子接口:Chair
/**
* 椅子接口
*/
public interface Chair {
String getType();
}
木質(zhì)椅子:WoodenChair
/**
* 木質(zhì)椅
*/
public class WoodenChair implements Chair {
private String type = "木質(zhì)椅";
@Override
public String getType() {
return type;
}
}
塑料椅:PlasticChair
/**
* 塑料椅
*/
public class PlasticChair implements Chair {
private String type = "塑料椅";
@Override
public String getType() {
return type;
}
}
家具工廠接口:FurnitureFactory
/**
* 家具工廠
*/
public interface FurnitureFactory {
Desk createDesk();
Chair createChair();
}
木質(zhì)家具工廠:WoodenFurnitureFactory
/**
* 木質(zhì)家具工廠
*/
public class WoodenFurnitureFactory implements FurnitureFactory {
@Override
public Desk createDesk() {
return new WoodenDesk();
}
@Override
public Chair createChair() {
return new WoodenChair();
}
}
塑料家具工廠:PlasticFurnitureFactory
/**
* 塑料家具工廠
*/
public class PlasticFurnitureFactory implements FurnitureFactory {
@Override
public Desk createDesk() {
return new PlasticDesk();
}
@Override
public Chair createChair() {
return new PlasticChair();
}
}
測試類:Clienter
/**
* 測試類
*/
public class Clienter {
public static void main(String[] args) {
FurnitureFactory factory = new PlasticFurnitureFactory();
Desk desk = factory.createDesk();
Chair chair = factory.createChair();
System.out.println(desk.getType());
System.out.println(chair.getType());
}
}
執(zhí)行結(jié)果:
塑料桌
塑料椅
三撮抓、解析
通過上面的例子妇斤,對(duì)比《Java設(shè)計(jì)模式系列-工廠方法模式》中工廠方法模式的例子,可以看出二者場景的不同之處胀滚,抽象工廠模式面對(duì)的是一個(gè)組合體趟济,如果將這一點(diǎn)排除的話乱投,其他方面看起來咽笼,二者還是相似的。
這里在目標(biāo)每添加一種組合時(shí)戚炫,就需要新建一個(gè)工廠實(shí)現(xiàn)來對(duì)應(yīng)剑刑,這一點(diǎn)滿足開閉原則,不會(huì)修改已有類双肤。
但是有一種情況施掏,會(huì)導(dǎo)致修改原有類,那就是當(dāng)目標(biāo)需要在家具中新增一種家具類型的時(shí)候茅糜,比如例子中七芭,家具組合中只包含桌子和椅子,如果再添加一種書柜蔑赘,那么所有的工廠包括工廠接口都面臨修改狸驳。