原創文章,轉載請標註出處:Java設計模式之《抽象工廠模式》及使用場景html
抽象工廠模式是對工廠方法模式的再升級,可是兩者面對的場景稍顯差異。java
工廠方法模式面對的目標通常都是單類的,就好比《ava設計模式之《工廠方法模式》及使用場景》中所舉的例子,目標就是桌子這一類商品。設計模式
若是是這樣的呢:生產的是桌椅組合,目標的一套商品,每一套商品中的每類商品的種類的不一樣的,不一樣的組合造成不一樣的套裝。ide
這種狀況下,就須要使用抽象工廠模式測試
咱們還以傢俱爲例:spa
桌子接口:Desk設計
/** * 桌子接口 */ public interface Desk { String getType(); }
木質桌子:WoodenDesk代理
/** * 木質桌子 */ public class WoodenDesk implements Desk { private String type = "木質桌"; @Override public String getType() { return type; } }
塑料桌子:PlasticDeskcode
/** * 塑料桌 */ public class PlasticDesk implements Desk { private String type = "塑料桌"; @Override public String getType() { return type; } }
椅子接口:Chairhtm
/** * 椅子接口 */ 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設計模式之《工廠方法模式》及使用場景中工廠方法模式的例子,能夠看出兩者場景的不一樣之處,抽象工廠模式面對的是一個組合體,若是將這一點排除的話,其餘方面看起來,兩者仍是類似的。
這裏在目標每添加一種組合時,就須要新建一個工廠實現來對應,這一點知足開閉原則,不會修改已有類。
可是有一種狀況,會致使修改原有類,那就是當目標須要在傢俱中新增一種傢俱類型的時候,好比例子中,傢俱組合中只包含桌子和椅子,若是再添加一種書櫃,那麼全部的工廠包括工廠接口都面臨修改。
同系列文章:
原文出處:https://www.cnblogs.com/V1haoge/p/10755412.html