昨天看了工廠模式後,今天的抽象工廠就容易入手啦。
昨天我們用工廠模式製作了一個椅子工廠,
假如今天我們今天要擴展我們的商業模式,發展系列家具呢?
簡單風格的系列家具:椅子、桌子,
日式風格系列家具:椅子、桌子。
我們會有一個工廠負責簡單風格、另一個工廠負責日式風格。
來看看圖:
圖片來源:Abstract Factory
昨天我們有一個類別來製作椅子,今天也是一樣,多了類別來處理桌子,
** 使用情境 **
//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的模式。
單一職責Single responsibility principle (SRP)
開關原則 Open-Close principle (OCP)
圖片改自:African Flag Origins
環遊非洲第23天-非洲101-非洲國旗的紅黃綠
看看非洲國旗,有沒有發現一件事情?
有沒有很多紅綠黃啊?
這當然不是巧合,我們之前提到在19世紀,衣索比亞在自己的國土上打敗了義大利,
變成了從未被殖民的國家,在這場戰役後,他們便創造了自己的國旗,以紅綠黃為基底。
三個顏色代表了上帝在大洪水之後創造的彩虹,反映了衣索比亞基督教的傳統。20世紀,迦納是第一個獨立的非洲國家,他們致敬衣索比亞戰勝歐洲國家的成功事蹟,
也以紅黃綠為國旗基底。之後獨立的國家也都採用這個顏色。
之前提到的泛非運動,也是以這三個顏色當作標誌,之後還加入了代表黑皮膚人民的黑色。
雖然各國解讀不一,但大致可以解釋為:紅色代表人民的鮮血、黃色代表財富、綠色代表非洲富饒可耕的大地。
Design Patterns-Abstract Factory