設計思想學習—抽象工廠模式

抽象工廠模式

抽象工廠模式(Abstract Factory):爲創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。

抽象工廠模式組成

  • 抽象工廠(Creator)角色:這是工廠方法模式的核心,定義了創建產品的方法。與應用系統無關。具體工廠角色必須實現這個接口才能創建對象。

  • 具體工廠(Concrete Creator)角色:實現了抽象工廠角色的接口,含有與應用密切相關的邏輯,並且接受應用程序的調用以創建產品對象。

  • 抽象產品(Product)角色:定義了產品的共性,實現對產品最抽象的定義。

  • 具體產品(Concrete Product)角色:實現抽象產品角色的接口。工廠方法所創建的對象就是該角色的實例。

UML圖
這裏寫圖片描述

個人理解
首先我要說的是對於定義我並不能很好的理解

網絡上面資料都是說抽象工廠和工廠方法不同的是:

  • 工廠方法針對一個產品類,抽象工廠針對多個產品類
  • 工廠方法針對一個產品等級,抽象工廠針對多個產品等級
  • 工廠方法每個具體工廠類只能創建一個具體產品類的實例,抽象工廠每個具體工廠類可以創建多個具體產品類的實例

然而這裏引入了產品等級的概念,而在抽象工廠中還有一個產品族的概念
在這裏我把產品等級理解成可以抽象成一類產品的不同產品
產品族理解成相互關聯的不同產品類的產品,就好像小米手機和小米電視,他們的關係就是同屬於小米的產品但是又分屬於手機類和電視類,圖片裏面有一點點錯誤,我應該把工廠給去掉的。
話不多說用代碼來實現

舉個例子

interface MyFactory{
    Car produceCar();
    Plane producePlane();
}
interface Car{
    void carSay();
}
class ACar implements Car{
    @Override
    public void carSay() {
        System.out.println("我是奧迪");
    }

}
class BCar implements Car{
    @Override
    public void carSay() {
        System.out.println("我是紅旗");
    }
}
interface Plane{
    void planeSay();
}
class APlane implements Plane{
    @Override
    public void planeSay() {
        System.out.println("我是波音747");  
    }

}
class BPlane implements Plane{
    @Override
    public void planeSay() {
        System.out.println("我是C919");   
    }

}
class ChinaFactory implements MyFactory{
    @Override
    public Car produceCar() {
        return new ACar();
    }

    @Override
    public Plane producePlane() {
        return new APlane();
    }   
}
class foreignFactory implements MyFactory{
    @Override
    public Car produceCar() {
        return new BCar();
    }

    @Override
    public Plane producePlane() {
        return new BPlane();
    }
}
public class Client {
    public static void main(String[] args) {
        MyFactory one=new ChinaFactory();
        Car car =one.produceCar();
        Plane plane=one.producePlane();
        car.carSay();
        plane.planeSay();
        one=new foreignFactory();
        car =one.produceCar();
        plane=one.producePlane();
        car.carSay();
        plane.planeSay();
    }
}

這裏輸出的是:
我是奧迪
我是波音747
我是紅旗
我是C919

在這裏運用抽象工廠方法增加一類存在產品族的產品非常容易只要增加一類產品,然後更改抽象工廠、具體工廠的方法。

雖然增加簡單了,但是難點確是在那一類產品必須是存在於產品族中的。
還有一點是修改抽象工廠和具體工廠方法違背了開閉原則。

然而我看設計思想一書中給出的解決辦法是:把抽象工廠類和具體工廠全部替換成一個簡單工廠,然後通過配置文件加反射的辦法來替換掉switch語句。

我知道設計思想不是看了就能會就能十分通透,還需要不少代碼量積累和學習,所以我的目標僅僅是先理解一點,然後去帶着理解去看一些別人的代碼或者一些框架和底層源碼,所以這裏我就不去深究怎麼用反射來解決這個問題了,有興趣的小夥伴可以自己去研究。

套用一個別人的總結 (^__^) 嘻嘻

無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極爲相似的,他們的最終目的都是爲了解耦。

在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因爲他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了一個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對於抽象工廠模式,當減少一個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。
所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章