設計模式與程式架構(五)

更新於 發佈於 閱讀時間約 6 分鐘

※ 工廠模式

定義:

工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。

特點:

具有高度標準化和同質性的特點,僅存在一些很小的差異。

優點:

  • 使用者無需了解工廠內部的具體實作過程,只需給出關鍵字即可獲得所需的產品實例。這提高了使用的便利性。
  • 產品擁有高度同質性,各個實例的功能非常一致,只有微小差異。這確保了產品的穩定性和可靠性。
  • 隱藏了工廠內部的複雜性,讓使用者能專注於自己的需求,而不必過多關注產品的內部實現。有助於提升使用體驗。

使用場合:

  • 當一系列物件具有相似的性質,只有少部分差異時,工廠模式能夠很好地管理這種情況。

舉例來說,使用工廠模式來管理電子商務網站裡面的多種類型的產品,例如電腦、手機、平板等品項就不必關心每種產品的具體細節。同時,工廠模式巧妙地運用了多型的概念,讓客戶端代碼可以透過通用的介面和方法來操作不同類型的產品,這增加了代碼的靈活性和可讀性。

※ 工廠模式範例

共同條件:

//共同有輪子和車子的類型
interface Car {
wheelNumber: number
carType: string

getType(): string
getName(): string
}
//輪子和車子的類型內容不一樣
class BMW implements Car {
wheelNumber: number = 4
carType: string = "car"

getType = () => this.carType
getName = () => this.constructor.name
}
class Mitsubishi_Fuso implements Car {
wheelNumber: number = 4
carType: string = "truck"

getType = () => this.carType
getName = () => this.constructor.name
}
class RAV4 implements Car {
wheelNumber: number = 4
carType: string = "rv"

getType = () => this.carType
getName = () => this.constructor.name
}

※ 簡單工廠模式寫法:

//將製造車子的程式碼包裝在工廠模式中
class SimpleFactory {
static getCar = (type: string) => {
switch (type) {
case "BMW": return new BMW()
case "mitsubishi": return new Mitsubishi_Fuso()
case "RAV": return new RAV4()
}
}
}
//簡單工廠模式
const car1 = SimpleFactory.getCar('BMW')
const car2 = SimpleFactory.getCar('mitsubishi')
const car3 = SimpleFactory.getCar('RAV')

console.log(car1?.getName(), "-->", car1?.getType())
console.log(car2?.getName(), "-->", car2?.getType())
console.log(car3?.getName(), "-->", car3?.getType())
// ​BMW --> car
// MitsubishiFuso --> truck
// RAV4 --> rv

※ 抽象工廠模式寫法:

//將改成工廠改成專一化,讓每個工廠都專門生產自己的車子。
class Factory {
//擁有 getCar的屬性
static getCar() {

}
}
//好處是未來需要什麼樣的車子,就去建立它專屬的工廠
class BMWFactory implements Factory {
static getCar() {
return new BMW()
}
}

class MitsubishiFusoFactory implements Factory {
static getCar() {
return new MitsubishiFuso()
}
}

class RAV4Factory implements Factory {
static getCar() {
return new RAV4()
}
}

const car1 = BMWFactory.getCar()
const car2 = MitsubishiFusoFactory.getCar()
const car3 = RAV4Factory.getCar()

console.log(car1.getName(), "-->", car1.getType())
console.log(car2.getName(), "-->", car2.getType())
console.log(car3.getName(), "-->", car3.getType())
// ​BMW --> car
// MitsubishiFuso --> truck
// RAV4 --> rv




全端網頁開發專業知識分享
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
※ 設計模式的五大精神介紹(S.O.L.I.D): ※ 第一大精神 — S:單一職責原則(Single responsibility principle, SRP) ※ 定義: 每個物件,不管是類別或函數,都應該只負責一項功能。 當需求改變時,僅需改相關的區域,而不需要更動其他不相關的部分
※ TypeScript範例說明: interface ITest { test1: string test2: number print: (arg: string[]) => boolean } class Test implements ITest { public te
※ 何謂Typescript? Typescript是Microsoft開發出來的一種JavaScript的擴展程式語言。 ※ 為什麼選擇 TypeScript? 靜態型別: 在執行程式碼之前就能避免許多錯誤。 幫助開發人員更快發現型別使用上的問題。 有效提升開發應用程式的效率。 輕鬆
※ OPP第三大核心-多型 ※ 多型的基本定義: 多型是利用繼承的特性,讓不同的子類別可以實現相同的介面,但在呼叫這些介面的方法時會表現出不同的行為。這使得程式設計更具彈性和擴展性,避免了複雜的條件判斷式,同時促進了代碼的重用。 class Animal { makeSound() {
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
※ 設計模式的五大精神介紹(S.O.L.I.D): ※ 第一大精神 — S:單一職責原則(Single responsibility principle, SRP) ※ 定義: 每個物件,不管是類別或函數,都應該只負責一項功能。 當需求改變時,僅需改相關的區域,而不需要更動其他不相關的部分
※ TypeScript範例說明: interface ITest { test1: string test2: number print: (arg: string[]) => boolean } class Test implements ITest { public te
※ 何謂Typescript? Typescript是Microsoft開發出來的一種JavaScript的擴展程式語言。 ※ 為什麼選擇 TypeScript? 靜態型別: 在執行程式碼之前就能避免許多錯誤。 幫助開發人員更快發現型別使用上的問題。 有效提升開發應用程式的效率。 輕鬆
※ OPP第三大核心-多型 ※ 多型的基本定義: 多型是利用繼承的特性,讓不同的子類別可以實現相同的介面,但在呼叫這些介面的方法時會表現出不同的行為。這使得程式設計更具彈性和擴展性,避免了複雜的條件判斷式,同時促進了代碼的重用。 class Animal { makeSound() {
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
《您的品牌是製造思維還是消費思維?》擁有一個知名的品牌好處多多,但向來以「生產導向」的代工廠,該如何跨足「顧客導向」的品牌市場呢?本課程將引導學員面對代工廠發展品牌時常面臨的問題,進而調整自己的經營心態與做法,讓品牌之路一帆風順!
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
工業風裝潢有別於其他風格的明亮、完美無瑕,反而著重於建材、空間的原始況味。融合了粗獷、質樸的元素,並結合了現代時尚的設計,創造出充滿個性感又獨具特色的風格。這種風格不僅在個人住宅中受到歡迎,也在商業空間、餐廳、咖啡館等地方大放異彩。現在就跟著幸福空間一起來看看,工業風裝潢的特色有哪些,又需要花多
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
替產業做設計 有人要我談程式設計,那我就稍微談一下。我從事的大都是產業的工作,所以我們也從如何替產業做設計來談起。基本上,每個產業都會有自己的作業流程,大同小異。但是基礎來做都是一樣的,都會有客戶、物料、產品、供應商、員工等資料。不同的是,由於企業型態的不同,他們每個人有不同的作業流程。這個作業流
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
《您的品牌是製造思維還是消費思維?》擁有一個知名的品牌好處多多,但向來以「生產導向」的代工廠,該如何跨足「顧客導向」的品牌市場呢?本課程將引導學員面對代工廠發展品牌時常面臨的問題,進而調整自己的經營心態與做法,讓品牌之路一帆風順!
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
Thumbnail
工業風裝潢有別於其他風格的明亮、完美無瑕,反而著重於建材、空間的原始況味。融合了粗獷、質樸的元素,並結合了現代時尚的設計,創造出充滿個性感又獨具特色的風格。這種風格不僅在個人住宅中受到歡迎,也在商業空間、餐廳、咖啡館等地方大放異彩。現在就跟著幸福空間一起來看看,工業風裝潢的特色有哪些,又需要花多
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
替產業做設計 有人要我談程式設計,那我就稍微談一下。我從事的大都是產業的工作,所以我們也從如何替產業做設計來談起。基本上,每個產業都會有自己的作業流程,大同小異。但是基礎來做都是一樣的,都會有客戶、物料、產品、供應商、員工等資料。不同的是,由於企業型態的不同,他們每個人有不同的作業流程。這個作業流