日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 技術學院 > 技術前線
[導讀]工廠方法模式是一種創(chuàng)建型模式,是簡單工廠模式的一個升級版本,主要解決簡單工廠模式不符合開閉原則的問題。本文會先說一下簡單工廠模式,以及存在的問題,然后再引出工廠模式。

1. 介紹

工廠方法模式是一種創(chuàng)建型模式,是簡單工廠模式的一個升級版本,主要解決簡單工廠模式不符合開閉原則的問題。本文會先說一下簡單工廠模式,以及存在的問題,然后再引出工廠模式。

工廠設計模式是一種創(chuàng)建對象的設計模式,它的主要目的是通過定義一個接口來創(chuàng)建對象,使得子類決定實例化哪個類。這篇文章,我們將分析工廠模式是什么,它包含什么類型以及如何工作。

從整體上看,工廠模式可以分為三種主要類型:簡單工廠模式、工廠方法模式和抽象工廠模式。

1.1 簡單工廠模式

簡單工廠模式定義一個創(chuàng)建對象的類(工廠類)來負責創(chuàng)建其他對象(產品對象)的實例,這個類(工廠類)中的創(chuàng)建功能根據參數不同,創(chuàng)建不同的對象(產品對象)實例。這就存在一個問題,每增加一個產品類,就要修改工廠的創(chuàng)建邏輯,增加一個相應的產品對象創(chuàng)建,這違反了程序設計的開閉原則。

概述

簡單工廠模式并不是一個正式的設計模式,而是一個創(chuàng)建對象的簡單方法。在簡單工廠模式中,通常會有一個工廠類,它根據參數的不同返回不同類型的對象。這個模式的優(yōu)點是簡單明了,但缺點是違背了開閉原則。

角色

工廠類:負責創(chuàng)建產品的實例,提供一個靜態(tài)方法供外部調用。

產品類:所有產品類都需實現(xiàn)相同的接口,用于定義產品的公共行為。

客戶端:通過工廠類來獲取產品實例,并使用這些實例。

設計模式之簡單工廠模式(C#語言描述)

嚴格意義上來說,簡單工廠模式并不屬于GoF的23種設計模式,但是它是學習其他工廠模式的基礎和前提條件。理解了簡單工廠模式,學習工廠方法模式和抽象工廠模式會比較容易一些。

簡單工廠模式的定義

定義一個工廠類,他可以根據不同的參數返回不同類的實例。通常情況下,被創(chuàng)建的類的實例通常都具有共同的父類。

簡單工廠模式又可以稱之為靜態(tài)工廠方法模式,因為創(chuàng)建對象實例的方法通常都是靜態(tài)方法。

在簡單工廠模式中,只需要記住一點。一個簡單的參數可以即可獲得所需的對象實例。

簡單工廠模式的UML圖如下:

簡單工廠模式包含三個角色:

1、工廠角色(Factory):該類是簡單工廠的核心,我們所需要的對象實例就是這個類幫我們創(chuàng)建的,它里面有一個靜態(tài)方法GetProduct(string productType),我們通過傳入產品類型(productType)來得到我們想要的產品。

2、抽象產品角色(AbstractProduct):該類是所有產品的父類。它可以是接口或者抽象類。只有這樣我們才能給工廠的GetProduct(string productType)方法定義返回值。

3、實體產品(ConcreteProductA,ConcreteProductB,ConcreteProductC):這些類是簡單工廠最終要創(chuàng)建的目標,也是客戶端最終想要的對象實例。

現(xiàn)在來假設一種場景,我們開發(fā)過程中,肯定會用到按鈕,圓形按鈕、正方形按鈕、矩形按鈕等等,在程序的很多地方我們都可能會復用這些按鈕。我們可以通過一個簡單工廠來幫助我們創(chuàng)建這些按鈕。

簡單工廠模式的類圖

SimpleFactory是個工廠類,負責創(chuàng)建對象(具體的工廠)。Product是要創(chuàng)建產品的抽象類,負責定義統(tǒng)一的接口。ProductA和ProductB是具體的產品類型,是Product的實現(xiàn)。我們看一下簡單工廠模式的優(yōu)缺點。

簡單工廠模式優(yōu)點:

實現(xiàn)簡單、結構清晰。抽象出一個專門的工廠類來負責某類工廠對象的創(chuàng)建。使用者可以不關注具體工廠對象的類名,只要傳入相應的參數就能創(chuàng)建對應的工廠對象。簡單工廠模式的缺點:

不易擴展,一旦新增產品類型,就得修改工廠的創(chuàng)建邏輯,不符合開閉原則。當產品類型較多的時候,工廠創(chuàng)建邏輯會過于復雜,不利于維護。簡單工廠模式的應用場景:

產品具有明顯的繼承關系,并且產品的類型不多或有限。所有的產品具體有相同的方法和類似的屬性,使用者不關心具體的類型,只希望傳入合適的參數,然后返回合適的工廠對象。1.2 工廠方法模式

為了解決簡單工廠存在的,新增產品類型,就修改工廠的創(chuàng)建邏輯的問題。提出了工廠方法模式。工廠方法模式定義了一個創(chuàng)建對象(產品對象)的接口,讓子類(工廠類)來決定創(chuàng)建哪個類(產品類)的實例。它是一個類(工廠類)的實例化,延遲到其子類。

Product是要創(chuàng)建產品的抽象類,ProductA和ProductB是具體的產品類型。Factory是所有工廠的抽象類,負責定義統(tǒng)一的接口。ProductAFactory和ProductBFactory是具體的工廠類,分別負責產品ProductA和ProductB的創(chuàng)建。工廠方法類利用依賴倒置原則,高層模塊不依賴于底層的模塊,它們應該依賴于抽象,面向接口編程,從而解決了簡單工廠模式違反軟件設計的開閉原則的問題。工廠方法模式也有一些優(yōu)缺點,接下來我們看一下。

工廠方法模式的優(yōu)點:

解決了簡單工廠模式違反開閉原則的問題,使程序擴展性增強。工廠方法模式的缺點:

對于由多種分類(存在不同的分類方式組合)的產品,或者具有二級分類的產品,工廠方法模式不適用。工廠方法模式的應用場景:

客戶端不知道它所需要的對象的類。工廠類希望通過其子類來決定創(chuàng)建哪個具體類的對象。2, 舉例

一般主程序只關注業(yè)務邏輯(抽象類接口),不關心具體的業(yè)務細節(jié)(抽象類接口的具體實現(xiàn))。這些業(yè)務細節(jié)就可以放在創(chuàng)建對象的邏輯(工廠創(chuàng)建邏輯)中,主程序只要設置指定的參數,就能通過創(chuàng)建對象的邏輯獲取相應對象(工廠對象)。

接下來會分別舉例說明簡單工廠模式、工廠方法模式的C語言實現(xiàn)。

2.1 簡單工廠模式舉例

#include

#include

enum {

PRODUCTA = 1,

PRODUCTB,

PRODUCTC,

};

// define product interface

typedef struct Product {

void (*show)(struct Product*);

} Product;

// define specific productA class

typedef struct ProductA {

Product product;

} ProductA;

// define productA show function

void ProductA_show(Product* product) {

printf("This is ProductA\n");

}

// define specific productB class

typedef struct ProductB {

Product product;

} ProductB;

// define productB show function

void ProductB_show(Product* product) {

printf("This is ProductB\n");

}

// define factory class

typedef struct Factory {

Product* (*create_product)(int);

} Factory;

// define factory create product logic

Product* factory_create_product(int type) {

Product* product = NULL;

switch (type) {

case 1:

product = (Product*)malloc(sizeof(ProductA));

product->show = ProductA_show;

break;

case 2:

product = (Product*)malloc(sizeof(ProductB));

product->show = ProductB_show;

break;

default:

printf("Invalid product type\n");

break;

}

return product;

}

int main() {

// implement factory instance

Factory simple_factory = { factory_create_product };

// use factory instance to create specific productA

Product* productA = simple_factory.create_product(PRODUCTA);

productA->show(productA);

free(productA);

// use factory instance to create specific productB

Product* productB = simple_factory.create_product(PRODUCTB);

productB->show(productB);

free(productB);

// use factory instance to create specific productC

Product* productC = simple_factory.create_product(PRODUCTC);

if (productC != NULL) {

free(productC);

}

return 0;

}

在這個例子中,定義了一個產品接口(Product)和兩個具體產品類(ProductA 和 ProductB),這兩個具體的產品類都實現(xiàn)了產品接口。此外,還定義了一個工廠類(Factory),它有一個 create_product 方法,通過該方法可以根據傳入的參數創(chuàng)建不同類型的產品對象。

在 main 函數中,使用工廠類實例化了一個工廠對象,然后用這個工廠對象創(chuàng)建了具體產品對象ProductA 和ProductB,并調用它們的 show 方法打印出相應的信息。當傳入一個無效的參數時,工廠類會打印出錯誤信息。

2.2 工廠方法模式舉例

#include

#include

// define product interface

typedef struct Product {

void (*show)(struct Product*);

} Product;

// define specific productA class

typedef struct ProductA {

Product product;

} ProductA;

// define productA show function

void ProductA_show(Product* product) {

printf("This is ProductA\n");

}

// define specific productB class

typedef struct ProductB {

Product product;

} ProductB;

// define productB show function

void ProductB_show(Product* product) {

printf("This is ProductB\n");

}

// define factory interface

typedef struct Factory {

Product* (*create_product)(struct Factory*);

} Factory;

// define specific factoryA class

typedef struct FactoryA {

Factory factory;

} FactoryA;

// inplement factoryA create_product function

Product* factoryA_create_product(Factory* factory) {

Product* product = (Product*)malloc(sizeof(Product));

product->show = ProductA_show;

return product;

}

// define specific factoryB class

typedef struct FactoryB {

Factory factory;

} FactoryB;

// inplement factoryB create_product function

Product* factoryB_create_product(Factory* factory) {

Product* product = (Product*)malloc(sizeof(Product));

product->show = ProductB_show;

return product;

}

int main() {

// create specific factoryA instance

FactoryA FactoryA;

FactoryA.factory.create_product = factoryA_create_product;

// create specific factoryB instance

FactoryB FactoryB;

FactoryB.factory.create_product = factoryB_create_product;

// use specific factory instance create specific product

Product* productA = FactoryA.factory.create_product(&FactoryA.factory);

productA->show(productA);

free(productA);

// use specific factory instance create specific product

Product* productB = FactoryB.factory.create_product(&FactoryB.factory);

productB->show(productB);

free(productB);

return 0;

}

在這個例子中,定義了一個產品接口(Product)和兩個具體產品類(ProductA 和 ProductB),這兩個具體的產品類都實現(xiàn)了產品接口。另外,還定義了一個工廠接口(Factory)和兩個具體工廠類(FactoryA 和 FactoryB),它們都實現(xiàn)了工廠接口。每個具體工廠類都有一個創(chuàng)建產品的方法,通過該方法可以創(chuàng)建相應的產品對象。

在 main 函數中,首先創(chuàng)建了具體工廠對象FactoryA 和 FactoryB,然后通過它們的create_product方法分別創(chuàng)建了具體產品對象ProductA 和ProductB。最后,使用 free 函數釋放了創(chuàng)建的產品對象。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉