iT邦幫忙

2021 iThome 鐵人賽

DAY 10
2
Software Development

淺談物件導向與Design Pattern介紹系列 第 10

IT鐵人DAY 10-Abstract Factory 抽象工廠

  今天要認識的Abstract Factory與Factory Method很像,算是Factory Method強化版,現在就讓我們來了解它們之間的差異吧!


問題情境與解析

  假想現在有一個工廠專門供應運動服裝,有球衣、球褲、球鞋等,有一系列的產品,但隨著事業越做越大,與不同的品牌合作,像是Nike、Adidas等,而原本工廠的系統添加新產品或是產品系列的話會需要更改原本的程式,若是越來越多品牌或是商品與之合作,程式只會越來越複雜,且重複相關的程式碼會一直在系統裡排程。再說供應商應該會經常更新他們的產品目錄,我想不會有人希望每次都要更改核心程式碼。

  使用抽象工廠模式的話,需要將產品系列(如球衣、球褲、球鞋等)做一個介面,讓不同品牌的產品(如Nike球衣、Adidas球衣等)去實作對應的介面;再來要將品牌作為抽象工廠,其中的方法包含產品系列中的所有產品,也就是球衣、球褲、球鞋等,讓不同品牌的具體工廠去實作,並回傳該品牌的產品。

  如此一來,就可以依據抽象工廠創建的品牌工廠類別,去回傳特定品牌的產品系列,舉個例子來說,Nike工廠類別只會做Nike的球衣、Nike的球褲及Nike的球鞋,並不會去做Adidas的球衣球褲等等。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210925/20140743UySdwFQYjM.png

Skeleton Code

interface ProductA {
    void doSomething();
}

class ProductA1 implements ProductA {
    public void doSomething() {
        // some operation
    }
}

class ProductA2 implements ProductA {
    public void doSomething() {
        // some operation
    }
}

interface ProductB {
    void doSomething();
}

class ProductB1 implements ProductB {
    public void doSomething() {
        // some operation
    }
}

class ProductB2 implements ProductB {
    public void doSomething() {
        // some operation
    }
}

interface AbstractFactory {
    abstract ProductA cteateProductA();
    abstract ProductB cteateProductB();
}

class Factory1 implements AbstractFactory {
    public ProductA cteateProductA() {
        return new ProductA1();
    }
    public ProductB cteateProductB() {
        return new ProductB1();
    }
}

class Factory2 implements AbstractFactory {
    public ProductA cteateProductA() {
        return new ProductA2();
    }
    public ProductB cteateProductB() {
        return new ProductB2();
    }
}

  雖然具體工廠(如Factory1)實例化了具體產品(如ProductA1),但其創建的方法必須回傳相應的抽象產品(如cteateProductA()回傳的產品型態是ProductA,而ProductA是抽象界面,並非是是具體類別ProductA1)。所以客戶端就不需要知道你用的是哪個工廠做了哪個特定的產品,唯一的窗口只有抽象工廠,並在初始化階段定義其出廠型態,如此就可以避免不必要的耦合發生在客戶與產品之間。


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 9-Factory Method 工廠方法
下一篇
IT鐵人DAY 11-Builder 建立者模式
系列文
淺談物件導向與Design Pattern介紹30

尚未有邦友留言

立即登入留言