最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設(shè)計模式之抽象工廠模式

 更新時間:2014年09月30日 12:53:45   作者:果凍想  
這篇文章主要介紹了C++設(shè)計模式之抽象工廠模式,本文要講的抽象工廠模式,就是工廠方法模式的擴(kuò)展和延伸,需要的朋友可以參考下

問題描述

之前講到了C++設(shè)計模式——工廠方法模式,我們可能會想到,后期產(chǎn)品會越來越多了,建立的工廠也會越來越多,工廠進(jìn)行了增長,工廠變的凌亂而難于管理;由于工廠方法模式創(chuàng)建的對象都是繼承于Product的,所以工廠方法模式中,每個工廠只能創(chuàng)建單一種類的產(chǎn)品,當(dāng)需要生產(chǎn)一種全新的產(chǎn)品(不繼承自Product)時,發(fā)現(xiàn)工廠方法是心有余而力不足。

舉個例子來說:一個顯示器電路板廠商,旗下的顯示器電路板種類有非液晶的和液晶的;這個時候,廠商建造兩個工廠,工廠A負(fù)責(zé)生產(chǎn)非液晶顯示器電路板,工廠B負(fù)責(zé)生產(chǎn)液晶顯示器電路板;工廠一直就這樣運(yùn)行著。有一天,總經(jīng)理發(fā)現(xiàn),直接生產(chǎn)顯示器的其余部分也挺掙錢,所以,總經(jīng)理決定,再建立兩個工廠C和D;C負(fù)責(zé)生產(chǎn)非液晶顯示器的其余部件,D負(fù)責(zé)生產(chǎn)液晶顯示器的其余部件。此時,旁邊參謀的人就說了,經(jīng)理,這樣做不好,我們可以直接在工廠A中添加一條負(fù)責(zé)生產(chǎn)非液晶顯示器的其余部件的生產(chǎn)線,在工廠B中添加一條生產(chǎn)液晶顯示器的其余部件的生產(chǎn)線,這樣就可以不用增加廠房,只用將現(xiàn)有廠房進(jìn)行擴(kuò)大一下,同時也方便工廠的管理,而且生產(chǎn)非液晶顯示器電路板的技術(shù)人員對非液晶顯示的其余部件的生產(chǎn)具有指導(dǎo)的作用,生產(chǎn)液晶顯示器電路板也是同理??偨?jīng)理發(fā)現(xiàn)這是一個不錯的主意。

再回到軟件開發(fā)的過程中來,工廠A和B就是之前所說的C++設(shè)計模式——工廠方法模式;總經(jīng)理再次建立工廠C和D,就是重復(fù)C++設(shè)計模式——工廠方法模式,只是生產(chǎn)的產(chǎn)品不同罷了。這樣做的弊端就如參謀所說的那樣,增加了管理成本和人力成本。在面向?qū)ο箝_發(fā)的過程中,是很注重對象管理和維護(hù)的,對象越多,就越難進(jìn)行管理和維護(hù);如果工廠數(shù)量過多,那么管理和維護(hù)的成本將大大增加;雖然生產(chǎn)的是不同的產(chǎn)品,但是可以二者之間是有微妙的關(guān)系的,如參謀所說,技術(shù)人員的一些技術(shù)經(jīng)驗是可以借鑒的,這就相當(dāng)于同一個類中的不同對象,之間是可以公用某些資源的。那么,增加一條流水線,擴(kuò)大廠房,當(dāng)然是最好的主意了。

實際問題已經(jīng)得到了解決,那么如何使用設(shè)計模式模擬這個實際的問題呢?那就是接下來所說的抽象工廠模式。

UML類圖

現(xiàn)在要講的抽象工廠模式,就是工廠方法模式的擴(kuò)展和延伸,但是抽象工廠模式,更有一般性和代表性;它具有工廠方法具有的優(yōu)點,也增加了解決實際問題的能力。

如圖所示,抽象工廠模式,就好比是兩個工廠方法模式的疊加。抽象工廠創(chuàng)建的是一系列相關(guān)的對象,其中創(chuàng)建的實現(xiàn)其實就是采用的工廠方法模式。在工廠Factory中的每一個方法,就好比是一條生產(chǎn)線,而生產(chǎn)線實際需要生產(chǎn)什么樣的產(chǎn)品,這是由Factory1和Factory2去決定的,這樣便延遲了具體子類的實例化;同時集中化了生產(chǎn)線的管理,節(jié)省了資源的浪費(fèi)。

適用場合

工廠方法模式適用于產(chǎn)品種類結(jié)構(gòu)單一的場合,為一類產(chǎn)品提供創(chuàng)建的接口;而抽象工廠方法適用于產(chǎn)品種類結(jié)構(gòu)多的場合,主要用于創(chuàng)建一組(有多個種類)相關(guān)的產(chǎn)品,為它們提供創(chuàng)建的接口;就是當(dāng)具有多個抽象角色時,抽象工廠便可以派上用場。

代碼實現(xiàn)

/*
** FileName   : AbstractFactoryPatternDemo
** Author    : Jelly Young
** Date     : 2013/11/19
** Description : More information
*/ 
 
#include <iostream>
using namespace std;
 
// Product A
class ProductA
{
public:
  virtual void Show() = 0;
};
 
class ProductA1 : public ProductA
{
public:
  void Show()
  {
    cout<<"I'm ProductA1"<<endl;
  }
};
 
class ProductA2 : public ProductA
{
public:
  void Show()
  {
    cout<<"I'm ProductA2"<<endl;
  }
};
 
// Product B
class ProductB
{
public:
  virtual void Show() = 0;
};
 
class ProductB1 : public ProductB
{
public:
  void Show()
  {
    cout<<"I'm ProductB1"<<endl;
  }
};
 
class ProductB2 : public ProductB
{
public:
  void Show()
  {
    cout<<"I'm ProductB2"<<endl;
  }
};
 
// Factory
class Factory
{
public:
  virtual ProductA *CreateProductA() = 0;
  virtual ProductB *CreateProductB() = 0;
};
 
class Factory1 : public Factory
{
public:
  ProductA *CreateProductA()
  {
    return new ProductA1();
  }
 
  ProductB *CreateProductB()
  {
    return new ProductB1();
  }
};
 
class Factory2 : public Factory
{
  ProductA *CreateProductA()
  {
    return new ProductA2();
  }
 
  ProductB *CreateProductB()
  {
    return new ProductB2();
  }
};
 
int main(int argc, char *argv[])
{
  Factory *factoryObj1 = new Factory1();
  ProductA *productObjA1 = factoryObj1->CreateProductA();
  ProductB *productObjB1 = factoryObj1->CreateProductB();
 
  productObjA1->Show();
  productObjB1->Show();
 
  Factory *factoryObj2 = new Factory2();
  ProductA *productObjA2 = factoryObj2->CreateProductA();
  ProductB *productObjB2 = factoryObj2->CreateProductB();
 
  productObjA2->Show();
  productObjB2->Show();
 
  if (factoryObj1 != NULL)
  {
    delete factoryObj1;
    factoryObj1 = NULL;
  }
 
  if (productObjA1 != NULL)
  {
    delete productObjA1;
    productObjA1= NULL;
  }
 
  if (productObjB1 != NULL)
  {
    delete productObjB1;
    productObjB1 = NULL;
  }
 
  if (factoryObj2 != NULL)
  {
    delete factoryObj2;
    factoryObj2 = NULL;
  }
 
  if (productObjA2 != NULL)
  {
    delete productObjA2;
    productObjA2 = NULL;
  }
 
  if (productObjB2 != NULL)
  {
    delete productObjB2;
    productObjB2 = NULL;
  }
}

相關(guān)文章

  • VS2022 CUDA環(huán)境配置的實現(xiàn)步驟

    VS2022 CUDA環(huán)境配置的實現(xiàn)步驟

    本文主要介紹了VS2022 CUDA環(huán)境配置的實現(xiàn)步驟,文中通過圖文示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • C語言字符串函數(shù)介紹與模擬實現(xiàn)詳解

    C語言字符串函數(shù)介紹與模擬實現(xiàn)詳解

    字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計算長度,字符查找等的函數(shù)
    2022-02-02
  • C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解

    C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解

    這篇文章主要為大家詳細(xì)介紹了c++有關(guān)文件創(chuàng)建、讀取和寫入的api:CreateFile、ReadFile、WriteFile的具體使用,需要的可以參考下
    2023-04-04
  • C++實現(xiàn)簡單的ls命令及其原理

    C++實現(xiàn)簡單的ls命令及其原理

    這篇文章主要介紹了C++實現(xiàn)簡單的ls命令及其原理,C++實現(xiàn)ls命令可通過調(diào)用系統(tǒng)函數(shù)實現(xiàn)讀取目錄中的文件名和屬性,再通過標(biāo)準(zhǔn)輸出進(jìn)行顯示,需要的朋友可以參考下
    2023-05-05
  • C++用easyx圖形庫實現(xiàn)障礙跑酷小游戲

    C++用easyx圖形庫實現(xiàn)障礙跑酷小游戲

    這篇文章主要為大家詳細(xì)介紹了C++用easyx圖形庫實現(xiàn)障礙跑酷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++鏈表實現(xiàn)通訊錄管理系統(tǒng)

    C++鏈表實現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++鏈表實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 解析c++中參數(shù)對象與局部對象的析構(gòu)順序的詳解

    解析c++中參數(shù)對象與局部對象的析構(gòu)順序的詳解

    本篇文章是對c++中參數(shù)對象與局部對象的析構(gòu)順序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言的字符空間與非字符空間你了解嗎

    C語言的字符空間與非字符空間你了解嗎

    這篇文章主要介紹了C語言的字符空間與非字符空間,本文給大家介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-08-08
  • C++中線程池ThreadPool源碼解析

    C++中線程池ThreadPool源碼解析

    線程池(threadpool)作為五大池之一(內(nèi)存池、連接池、線程池、進(jìn)程池、協(xié)程池),線程池的應(yīng)用非常廣泛,不管事客戶端程序還是后臺服務(wù)端,都是提高業(yè)務(wù)處理能力的必備模塊
    2022-09-09
  • 用C實現(xiàn)添加和讀取配置文件函數(shù)

    用C實現(xiàn)添加和讀取配置文件函數(shù)

    本篇文章是對用C語言實現(xiàn)添加和讀取配置文件函數(shù)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

安顺市| 交城县| 屏边| 平阴县| 石屏县| 常宁市| 平阴县| 盐边县| 滕州市| 长白| 邓州市| 平阳县| 安庆市| 余干县| 太原市| 思茅市| 玉溪市| 明水县| 那坡县| 长治县| 河间市| 邹城市| 吴桥县| 肇庆市| 东山县| 民勤县| 万载县| 新民市| 望谟县| 永平县| 嘉善县| 栖霞市| 鹤山市| 保康县| 康乐县| 临城县| 长兴县| 碌曲县| 渝北区| 花垣县| 中西区|