抽象工廠模式簡介,介紹了抽象工廠模式意圖,結構,產品族以及產品等級的概念,並且提供了代碼示例java版抽象工廠模式,抽象工廠模式與工廠模式的對比差異 ...
抽象工廠模式是工廠方法模式的進一步抽象 在工廠模式中,客戶端程式依賴(消費)一種抽象產品角色Product 所有的ConcreteCreator的返回類型都是Product,因為抽象工廠角色Creator就是返回Product 但是,如果一個系統需要依賴多個不同的抽象產品角色怎麼辦? 也就是需要Product1 Product2 ... 他們是不同的抽象角色,工廠模式就歇菜了,簡單工廠模式也只是一種類型 此時,就需要抽象工廠模式,抽象工廠模式可以創建多種類型的產品 簡言之,工廠模式只能生產一種產品,比如青島啤酒廠生產各式樣的啤酒,他不可能生產大米 抽象工廠角色就可以生產啤酒和大米
產品族與產品等級
想要理解抽象工廠的本質,需要先介紹兩個概念 產品族和產品等級結構產品等級結構指的是產品的分類劃分結構 功能相關聯的不同產品(位於不同的等級結構)就組成了一個產品族 |
一個產品族中,有多少個產品,跟產品等級結構的個數是一致的 也就是說有多少種產品,一個產品族就有多少個 有CRUD四個產品等級,一個mysql產品族就有四個產品 有雞腿漢堡兩個產品等級,KFC產品族就有兩種產品 |
產品族就是一個產品類別中拿出來一個 所以就是一個類型有多少種,就是有多少個產品族 |
意圖
提供一個創建一系列相關或者相互依賴對象的介面,而無需指定他們具體的類。 其實就是工廠方法模式中一個方法,創建一個類型,此處多個方法,創建多個類型,簡單理解就是這樣結構
說完了產品等級結構和產品族的概念 我們看下抽象工廠模式的結構產品等級結構product ProductA和ProductB 他們分別有對應的兩種類型的產品 ConcreteProductA1 和 ConcreteProductA2 ConcreteProductB1 和 ConcreteProductB2 |
抽象工廠角色Creator Creator可以創建ProductA和ProductB兩種抽象類型 他有兩個實現類工廠ConcreteCreator1和 ConcreteCreator2 |
具體的工廠ConcreteCreator 每一個ConcreteCreator都可以生產一個產品族的產品 也就是ConcreteCreator1可以生產ConcreteProductA1 和 ConcreteProductB1 |
角色介紹
抽象工廠角色(Abstract Factory) 工廠方法的核心,與系統具體邏輯無關,通常是java介面或者抽象類 所有的具體的工廠都需要實現它,也就是上圖中的Creator 具體工廠角色(Concrete Factory) 直接接受客戶端程式請求,創建產品的實例,它可以創建一個產品族的實例對象 抽象產品角色(Abstract Product) 為一類產品對象聲明一個抽象表示 具體產品角色(Concrete Product) 定義一個被創建的具體的對象的類型,實現Abstract Product介面 類似工廠模式,具體的工廠角色可以有多個,分別對應不同的產品族 有幾個產品族就會有幾個具體的工廠示例代碼
有兩個產品等級結構 Fruit和Vegetable 也就是有水果和蔬菜兩種商品 假設有兩個商店,他們都提供水果和蔬菜 第一個商店提供的水果和蔬菜是蘋果和土豆 第二個商店提供的水果和蔬菜是橘子和白菜 也就是蘋果Apple和土豆Potato是一個產品族,由一個店鋪在賣 橘子Orange和大白菜Cabbage是一個產品族,由一個店鋪在賣 產品類Fruit以及Apple和Orange與工廠模式中示例代碼一樣 Vegetable表示蔬菜的抽象角色 Potato和Cabbage為具體的蔬菜 有抽象工廠角色Factory 以及具體的工廠ConcreteFactory1 和 ConcreteFactory2 Fruit產品結構體系package abstractFactory; /** * Created by noteless on 2018/10/9. * Description: */ public interface Fruit { String description(); }
package abstractFactory; /** * Created by noteless on 2018/10/9. * Description: */ public class Apple implements Fruit { @Override public String description() { return "apple"; } }
package abstractFactory; /** * Created by noteless on 2018/10/9. * Description: */ public class Orange implements Fruit { @Override public String description() { return "Orange"; } }蔬菜產品結構體系
package abstractFactory; /** * Created by noteless on 2018/10/10. * Description: */ public interface Vegetable { String description(); }
package abstractFactory; /** * Created by noteless on 2018/10/10. * Description: */ public class Potato implements Vegetable { @Override public String description() { return "potato"; } }
package abstractFactory; /** * Created by noteless on 2018/10/10. * Description: */ public class Cabbage implements Vegetable { @Override public String description() { return "cabbage"; } }工廠體系
package abstractFactory; /** * Created by noteless on 2018/10/9. * Description: */ public interface Factory { Fruit createFruit(); Vegetable createVegetable(); }
package abstractFactory; /** * Created by noteless on 2018/10/10. * Description: */ public class ConcreateFactory1 implements Factory { @Override public Fruit createFruit() { return new Apple(); } @Override public Vegetable createVegetable() { return new Potato(); } }
package abstractFactory; /** * Created by noteless on 2018/10/10. * Description: */ public class ConcreateFactory2 implements Factory { @Override public Fruit createFruit() { return new Orange(); } @Override public Vegetable createVegetable() { return new Cabbage(); } }測試代碼 可以看得出來,下圖的形式中 只需要修改一行代碼,就可以做到整個產品族的切換