日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式——工厂模式(二)

發(fā)布時(shí)間:2024/4/18 asp.net 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式——工厂模式(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 工廠方法模式
        • 1.1工廠方法模式概述
        • 1.2工廠方法模式定義如下
        • 1.3工廠方法模式要點(diǎn)
        • 1.4設(shè)計(jì)步驟及代碼示例
        • 1.5工廠方法模式結(jié)構(gòu)圖中包含角色
        • 1.6工廠方法模式的主要優(yōu)點(diǎn)和缺點(diǎn)
        • 1.7工廠方法模式總結(jié)

工廠方法模式

1.1工廠方法模式概述

在簡單工廠模式中只提供一個工廠類,該工廠類處于對產(chǎn)品類進(jìn)行實(shí)例化的中心位置,它需要知道每一個產(chǎn)品對象的創(chuàng)建細(xì)節(jié),并決定何時(shí)實(shí)例化哪一個產(chǎn)品類。簡單工廠模式最大的缺點(diǎn)是當(dāng)有新產(chǎn)品要加入到系統(tǒng)中時(shí),必須修改工廠類,需要在其中加入必要的業(yè)務(wù)邏輯,這違背了“開閉原則”。此外,在簡單工廠模式中,所有的產(chǎn)品都由同一個工廠創(chuàng)建,工廠類職責(zé)較重,業(yè)務(wù)邏輯較為復(fù)雜,具體產(chǎn)品與工廠類之間的耦合度高,嚴(yán)重影響了系統(tǒng)的靈活性和擴(kuò)展性,而工廠方法模式則可以很好地解決這一問題。

在工廠方法模式中,我們不再提供一個統(tǒng)一的工廠類來創(chuàng)建所有的產(chǎn)品對象,而是針對不同的產(chǎn)品提供不同的工廠,系統(tǒng)提供一個與產(chǎn)品等級結(jié)構(gòu)對應(yīng)的工廠等級結(jié)構(gòu)。

1.2工廠方法模式定義如下

工廠方法模式(Factory Method Pattern):定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實(shí)例化。工廠方法模式讓一個類的實(shí)例化延遲到其子類。工廠方法模式又簡稱為工廠模式(Factory Pattern),又可稱作虛擬構(gòu)造器模式(Virtual Constructor Pattern)或多態(tài)工廠模式(Polymorphic Factory Pattern)。

1.3工廠方法模式要點(diǎn)

工廠方法模式提供一個抽象工廠接口來聲明抽象工廠方法,而由其子類來具體實(shí)現(xiàn)工廠方法,創(chuàng)建具體的產(chǎn)品對象。

1.4設(shè)計(jì)步驟及代碼示例

  • 步驟1:創(chuàng)建抽象工廠類,定義具體工廠的公共接口。
  • 步驟2:創(chuàng)建抽象產(chǎn)品類,定義具體產(chǎn)品的公共接口。
  • 步驟3:創(chuàng)建具體產(chǎn)品類(繼承抽象產(chǎn)品類)&定義生產(chǎn)的具體產(chǎn)品。
  • 步驟4:創(chuàng)建具體工廠類(繼承抽象工廠類),定義創(chuàng)建對應(yīng)具體產(chǎn)品實(shí)例的方法。
  • 步驟5:外界通過調(diào)用具體工廠類的方法,從而創(chuàng)建不同具體產(chǎn)品類的實(shí)例。

代碼示例

#include <iostream>using namespace std;class Car//車類 { public:virtual void Show(void) = 0;virtual ~Car() {} };class BydCar : public Car//比亞迪汽車 { public:BydCar() { cout << "Byd::Byd()" << endl; }~BydCar() {}virtual void Show(void){cout << "BYD auto" << endl;} };class GeelyCar : public Car//吉利汽車 { public:GeelyCar() { cout << "Geely::Geelyo" << endl; }~GeelyCar() {}virtual void Show(void){ cout << "GEELY auto" << endl; }};class Factory//車廠 { public:virtual Car* createCar(void) = 0; };class BydFactory : public Factory { public:virtual Car* createCar(void) { return (new BydCar()); } };class GeelyFactory : public Factory { public:virtual Car* createCar(void) { return (new GeelyCar()); } };int main() {Factory* factory = new BydFactory();Car* bydCar = factory->createCar();factory = new GeelyFactory();Car* GeelyCar = factory->createCar();delete factory;delete bydCar;delete GeelyCar;return 0; }

1.5工廠方法模式結(jié)構(gòu)圖中包含角色

  • 組成(角色):抽象產(chǎn)品(Product)
    關(guān)系:具體產(chǎn)品類型的基類。
    作用:描述具體產(chǎn)品的公共接口。
  • 組成(角色):具體產(chǎn)品(Concrete Product)
    關(guān)系:抽象產(chǎn)品類型的派生類(子類),工廠類創(chuàng)建的目標(biāo)類(具體工廠和具體產(chǎn)品之間一一對應(yīng))。
    作用:描述生產(chǎn)的具體產(chǎn)品。
  • 組成(角色):抽象工廠(Factory)
    關(guān)系:具體工廠的父類。
    作用:聲明了工廠方法(Factory Method),用于返回一個產(chǎn)品。抽象工廠是工廠方法模式的核心,所有創(chuàng)建對象的工廠類都必須實(shí)現(xiàn)該接口。
  • 組成(角色):具體工廠(Concrete Factory)
    關(guān)系:抽象工廠的子類;被外界調(diào)用。
    作用:描述具體工廠;實(shí)現(xiàn)FactoryMethod(創(chuàng)建產(chǎn)品的實(shí)例)工廠方法,并可由客戶端調(diào)用,返回一個具體產(chǎn)品類的實(shí)例。

與簡單工廠模式相比,工廠方法模式最重要的區(qū)別是引入了抽象工廠角色,抽象工廠可以是接口,也可以是抽象類或者具體類。

1.6工廠方法模式的主要優(yōu)點(diǎn)和缺點(diǎn)

  • 工廠放發(fā)模式有點(diǎn)如下:
    (1) 在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。
    (2) 基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠讓工廠可以自主確定創(chuàng)建何種產(chǎn)品對象,而如何創(chuàng)建這個對象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,就正是因?yàn)樗械木唧w工廠類都具有同一抽象父類。
    (3) 使用工廠方法模式的另一個優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時(shí),無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個具體工廠和具體產(chǎn)品就可以了,這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開閉原則”。
  • 工廠方法模式的缺點(diǎn)如下:
    (1) 在添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運(yùn)行,會給系統(tǒng)帶來一些額外的開銷。
    (2) 由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度。
  • 適用場景
    (1) 客戶端不知道它所需要的對象的類。在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名,只需要知道所對應(yīng)的工廠即可,具體的產(chǎn)品對象由具體工廠類創(chuàng)建,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。
    (2) 抽象工廠類通過其子類來指定創(chuàng)建哪個對象。在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要創(chuàng)建的對象,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則,在程序運(yùn)行時(shí),子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴(kuò)展。

1.7工廠方法模式總結(jié)

工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠模式的優(yōu)點(diǎn),同時(shí)還彌補(bǔ)了簡單工廠模式的不足。工廠方法模式是使用頻率最高的設(shè)計(jì)模式之一,是很多開源框架和API類庫的核心模式。

在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)哪一個產(chǎn)品類被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的设计模式——工厂模式(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。