iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0

創建型:抽象工廠模式

昨天看了工廠模式後,今天的抽象工廠就容易入手啦。

昨天我們用工廠模式製作了一個椅子工廠,
假如今天我們今天要擴展我們的商業模式,發展系列家具呢?
簡單風格的系列家具:椅子、桌子,
日式風格系列家具:椅子、桌子。

我們會有一個工廠負責簡單風格、另一個工廠負責日式風格。
來看看圖:

https://ithelp.ithome.com.tw/upload/images/20221008/20140247ScEAd6PiUh.jpg

圖片來源:Abstract Factory

昨天我們有一個類別來製作椅子,今天也是一樣,多了類別來處理桌子,

** 使用情境 **

  • 基本上就是你想要使用[工廠模式]的情境+你有系列的相關產品(多個種類)要處理

TS 案例

//1.客戶視角
//我們倒過來看,客戶只會知道有一個簡單風格工廠可以製作椅子,他要小椅子
const simpleChiar = SimpleStyleFactory.getChair()
//也可以製作大椅子
const jpChair = JapaneseStyleFactory.getTable()

//2.來看工廠
//來看看工廠裡面有啥
//基本的廠房模型
interface AbstractFactory {
    createProductA(): AbstractProductA;

    createProductB(): AbstractProductB;
}

//簡單風格的工廠為例子
class SimpleStyleFactory implements AbstractFactory{
    static getChair():ChairTemplate {
        return new SimpleStyleChair()
    }
    static getTable():TableTemplate {
        return new SimpleStyleTable()
    }
}

//(日式風格以此類推)
class JapaneseStyleFactory implements AbstractFactory{
    static getChair():ChairTemplate {
        return new JpStyleChair()
    }
    static getTable():TableTemplate {
        return new JpStyleTable()
    }
}


//3.來看工廠各部門
//椅子部門
//工廠返回的就是這個簡單風格的椅子類別
//我們在此定義細節
class SimpleStyleChair extends Chair{
   constructor() {
        //呼叫super()繼承Chair
        super()
        this.height = 40
        this.width = 40
        this.depth = 40
        //簡單風格就要全白啦
        this.color = 'white'
    }
}

//簡單工廠裡的桌子部門
//工廠返回的簡單風格桌子
class SimpleStyleTable extends Table{
   constructor() {
        //呼叫super()繼承Table
        super()
        this.height = 120
        this.width = 80
        this.length = 80
        this.color = 'white'
    }
}

//日式工廠裡的椅子部門
//日式工廠返回的日式風格椅子
//這邊的細節處理就跟簡單風格不同
//但都是擴展椅子類別
class JpStyleChair extends Chair{
   constructor() {
        //呼叫super()繼承Chair
        super()
        //日式風格修長一點
        this.height = 60
        this.width = 40
        this.depth = 40
        //日式風格來個粉色
        this.color = 'pink'
    }
}

//4. 我們來看看各部門共同使用的模型
// ChairTemplate 只是一個架構,Chair的類別才是我們的基本
// 覆蓋interface的方法和Property
export default class Chair implements ChairTemplate {
    height = 0
    width = 0
    depth = 0

    getDimensions(): dimension {
        return {
            width: this.width,
            depth: this.depth,
            height: this.height,
        }
    }
}

//ChairTemplate定義了類別的架構
//裡面有高寬深類別,還有一個getDimensions的功能
interface ChairTemplate {
    height: number
    width: number
    depth: number
    getDimensions(): dimension
}

//getDimension回傳的類型就會有高寬深
type dimension = {
    height: number
    width: number
    depth: number
}

應用到的原則

應用到的原則其實跟工廠模式一樣,另外要提的是,
常常我們在寫程式碼的時候,都會寫從工廠模式出發,再擴展成抽象工廠或Builder、Prototype的模式。

  1. 單一職責Single responsibility principle (SRP)

    1. 我們的ChairFactory只負責生產
  2. 開關原則 Open-Close principle (OCP)

    1. 你可以添加新的類別而不會影響到原本的類別
    2. 新增一種產品時,只要增加相應的具體產品子類和工廠子類就好


https://ithelp.ithome.com.tw/upload/images/20221008/20140247hl5Nut6hDf.jpg
圖片改自:African Flag Origins

環遊非洲第23天-非洲101-非洲國旗的紅黃綠

看看非洲國旗,有沒有發現一件事情?
有沒有很多紅綠黃啊?
這當然不是巧合,我們之前提到在19世紀,衣索比亞在自己的國土上打敗了義大利,
變成了從未被殖民的國家,在這場戰役後,他們便創造了自己的國旗,以紅綠黃為基底。
三個顏色代表了上帝在大洪水之後創造的彩虹,反映了衣索比亞基督教的傳統。

20世紀,迦納是第一個獨立的非洲國家,他們致敬衣索比亞戰勝歐洲國家的成功事蹟,
也以紅黃綠為國旗基底。之後獨立的國家也都採用這個顏色。
之前提到的泛非運動,也是以這三個顏色當作標誌,之後還加入了代表黑皮膚人民的黑色。
雖然各國解讀不一,但大致可以解釋為:紅色代表人民的鮮血、黃色代表財富、綠色代表非洲富饒可耕的大地。



參考

Design Patterns-Abstract Factory

Java设计模式(三) 抽象工厂模式


上一篇
工廠模式-用TS挑戰設計模式-D22
下一篇
觀察者模式-用TS挑戰設計模式-D24
系列文
分手前端菜雞之旅@非洲30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言