原創文章,轉載請標注出處:Java設計模式之《抽象工廠模式》及使用場景
一、概述
抽象工廠模式是對工廠方法模式的再升級,但是二者面對的場景稍顯差別。
工廠方法模式面對的目標一般都是單類的,就比如《ava設計模式之《工廠方法模式》及使用場景》中所舉的例子,目標就是桌子這一類商品。
如果是這樣的呢:生產的是桌椅組合,目標的一套商品,每一套商品中的每類商品的種類的不同的,不同的組合形成不同的套裝。
這種情況下,就需要使用抽象工廠模式
二、實例
我們還以家具為例:
桌子接口:Desk
/**
* 桌子接口
*/
public interface Desk {
String getType();
}
木質桌子:WoodenDesk
/**
* 木質桌子
*/
public class WoodenDesk implements Desk {
private String type = "木質桌";
@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();
}
木質椅子:WoodenChair
/**
* 木質椅
*/
public class WoodenChair implements Chair {
private String type = "木質椅";
@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();
}
木質家具工廠:WoodenFurnitureFactory
/**
* 木質家具工廠
*/
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());
}
}
執行結果:
塑料桌
塑料椅
三、解析
通過上面的例子,對比Java設計模式之《工廠方法模式》及使用場景中工廠方法模式的例子,可以看出二者場景的不同之處,抽象工廠模式面對的是一個組合體,如果將這一點排除的話,其他方面看起來,二者還是相似的。
這里在目標每添加一種組合時,就需要新建一個工廠實現來對應,這一點滿足開閉原則,不會修改已有類。
但是有一種情況,會導致修改原有類,那就是當目標需要在家具中新增一種家具類型的時候,比如例子中,家具組合中只包含桌子和椅子,如果再添加一種書櫃,那么所有的工廠包括工廠接口都面臨修改。
同系列文章:
- Java設計模式之《適配器模式》及應用場景
- Java設計模式之《外觀模式》及應用場景
- Java設計模式之《橋接模式》及應用場景
- Java設計模式之《單例模式》及應用場景
- Java設計模式之《觀察者模式》及應用場景
- Java設計模式之《調停者模式》及應用場景
- Java設計模式之《代理模式》及應用場景
- Java設計模式之《職責鏈模式》及應用場景
- Java設計模式之《享元模式》及應用場景
- Java設計模式之《構建者模式》及應用場景
- Java設計模式之《模板模式》及使用場景
- Java設計模式之《裝飾器模式》及應用場景
- Java設計模式之《工廠方法模式》及使用場景
- Java設計模式之《抽象工廠模式》及使用場景