亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++設(shè)計(jì)模式之工廠模式

 更新時(shí)間:2016年05月19日 08:55:20   作者:weixueyuan  
本文是C++設(shè)計(jì)模式系列文章的第一篇,主要給大家講述下工廠模式,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下

由遇到的問題引出工廠模式

在面向?qū)ο笙到y(tǒng)設(shè)計(jì)中經(jīng)??梢杂龅揭韵碌膬深悊栴}:

◆ 1.為了提高內(nèi)聚(Cohesion)和松耦合(Coupling),我們經(jīng)常會(huì)抽象出一些類的公共接口以形成抽象基類或者接口。這樣我們可以通過聲明一個(gè)指向基類的指針來指向?qū)嶋H的子類實(shí)現(xiàn),達(dá)到了多態(tài)的目的。這里很容易出現(xiàn)的一個(gè)問題 n 多的子類繼承自抽象基類,我們不得不在每次要用到子類的地方就編寫諸如 new ×××;的代碼。這里帶來兩個(gè)問題:
客戶程序員必須知道實(shí)際子類的名稱(當(dāng)系統(tǒng)復(fù)雜后,命名將是一個(gè)很不好處理的問題,為了處理可能的名字沖突,有的命名可能并不是具有很好的可讀性和可記憶性,就姑且不論不同程序員千奇百怪的個(gè)人偏好了)。
程序的擴(kuò)展性和維護(hù)變得越來越困難。

◆ 2.還有一種情況就是在父類中并不知道具體要實(shí)例化哪一個(gè)具體的子類。這里的意思為:假設(shè)我們?cè)陬?A 中要使用到類 B,B 是一個(gè)抽象父類,在 A 中并不知道具體要實(shí)例化那一個(gè) B 的子類,但是在類 A 的子類 D 中是可以知道的。在 A 中我們沒有辦法直接使用類似于 new ×××的語句,因?yàn)楦揪筒恢馈痢痢潦鞘裁础?/p>

以上兩個(gè)問題也就引出了工廠模式的兩個(gè)最重要的功能:

  1. 定義創(chuàng)建對(duì)象的接口,封裝了對(duì)象的創(chuàng)建;
  2. 使得具體化類的工作延遲到了子類中。

模式選擇

我們通常使用工廠模式來解決上面給出的兩個(gè)問題。在第一個(gè)問題中,我們經(jīng)常就是聲明一個(gè)創(chuàng)建對(duì)象的接口,并封裝了對(duì)象的創(chuàng)建過程。工廠這里類似于一個(gè)真正意義上的工廠(生產(chǎn)對(duì)象)。在第二個(gè)問題中,我們需要提供一個(gè)對(duì)象創(chuàng)建對(duì)象的接口,并在子類中提供其具體實(shí)現(xiàn)(因?yàn)橹挥性谧宇愔锌梢詻Q定到底實(shí)例化哪一個(gè)類)。

第一中情況的工廠的結(jié)構(gòu)示意圖為:

圖 1 所以的工廠模式經(jīng)常在系統(tǒng)開發(fā)中用到,但是這并不是工廠模式的最大威力所在(因?yàn)檫@可以通過其他方式解決這個(gè)問題)。工廠模式不單是提供了創(chuàng)建對(duì)象的接口,其最重要的是延遲了子類的實(shí)例化(第二個(gè)問題),以下是這種情況的一個(gè)工廠的結(jié)構(gòu)示意圖:

圖 2 中關(guān)鍵中工廠模式的應(yīng)用并不是只是為了封裝對(duì)象的創(chuàng)建,而是要把對(duì)象的創(chuàng)建放到子類中實(shí)現(xiàn):工廠中只是提供了對(duì)象創(chuàng)建的接口,其實(shí)現(xiàn)將放在工廠的子類Concrete工廠中進(jìn)行。這是圖 2 和圖 1 的區(qū)別所在。

工廠模式的實(shí)現(xiàn)

完整代碼示例(code):工廠模式的實(shí)現(xiàn)比較簡(jiǎn)單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用 C++實(shí)現(xiàn),并在 VC 6.0 下測(cè)試運(yùn)行)。

代碼片斷 1:Product.h

//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class Product{
 public:
 virtual ~Product() =0;
 protected:
 Product(); //屏蔽構(gòu)造函數(shù)
 private:
};
class ConcreteProduct:publicProduct{
 public:
 ~ConcreteProduct();
 ConcreteProduct();
 protected:
 private:
};
#endif //~_PRODUCT_H_

代碼片斷 2:Product.cpp

//Product.cpp
#include "Product.h"
#include<iostream>
using namespace std;
Product::Product(){
}
Product::~Product(){
}
ConcreteProduct::ConcreteProduct(){
 cout<<"ConcreteProduct...."<<endl;
}
ConcreteProduct::~ConcreteProduct(){
}

代碼片斷 3:Factory.h

//Factory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_
class Product;
class Factory{
 public:
 virtual ~Factory() = 0;
 virtual Product* CreateProduct() = 0;
 protected:
 Factory();
 private:
};
class ConcreteFactory:public Factory{
 public:
 ~ConcreteFactory();
 ConcreteFactory();
 Product* CreateProduct();
 protected:
 private:
};
#endif //~_FACTORY_H_

代碼片斷 4:Factory.cpp

//Factory.cpp
#include "Factory.h"
#include "Product.h"
#include <iostream>
using namespace std;
Factory::Factory(){
}
Factory::~Factory(){
}
ConcreteFactory::ConcreteFactory(){
 cout<<"ConcreteFactory....."<<endl;
}
ConcreteFactory::~ConcreteFactory(){
}
Product* ConcreteFactory::CreateProduct(){
 return new ConcreteProduct();
}

代碼片斷 5:main.cpp

//main.cpp
#include "Factory.h"
#include "Product.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[]){
 Factory* fac = new ConcreteFactory();
 Product* p = fac->CreateProduct();
 return 0;
}

代碼說明:示例代碼中給出的是工廠模式解決父類中并不知道具體要實(shí)例化哪一個(gè)具體的子類的問題,至于為創(chuàng)建對(duì)象提供接口問題,可以由工廠中附加相應(yīng)的創(chuàng)建操作例如Create***Product()即可。具體請(qǐng)參加討論內(nèi)容。

關(guān)于工廠模式的討論

工廠模式在實(shí)際開發(fā)中應(yīng)用非常廣泛,面向?qū)ο蟮南到y(tǒng)經(jīng)常面臨著對(duì)象創(chuàng)建問題:要?jiǎng)?chuàng)建的類實(shí)在是太多了。而工廠提供的創(chuàng)建對(duì)象的接口封裝(第一個(gè)功能),以及其將類的實(shí)例化推遲到子類(第二個(gè)功能)都部分地解決了實(shí)際問題。一個(gè)簡(jiǎn)單的例子就是筆者開開發(fā) VisualCMCS 系統(tǒng)的語義分析過程中,由于要為文法中的每個(gè)非終結(jié)符構(gòu)造一個(gè)類處理,因此這個(gè)過程中對(duì)象的創(chuàng)建非常多,采用工廠模式后系統(tǒng)可讀性性和維護(hù)都變得elegant 許多。

工廠模式也帶來至少以下兩個(gè)問題:

  1. 如果為每一個(gè)具體的 ConcreteProduct 類的實(shí)例化提供一個(gè)函數(shù)體,那么我們可能不得不在系統(tǒng)中添加了一個(gè)方法來處理這個(gè)新建的 ConcreteProduct,這樣工廠的接口永遠(yuǎn)就不肯能封閉(Close)。當(dāng)然我們可以通過創(chuàng)建一個(gè)工廠的子類來通過多態(tài)實(shí)現(xiàn)這一點(diǎn),但是這也是以新建一個(gè)類作為代價(jià)的。
  2. 在實(shí)現(xiàn)中我們可以通過參數(shù)化工廠方法,即給 工廠Method()傳遞一個(gè)參數(shù)用以決定是創(chuàng)建具體哪一個(gè)具體的 Product(實(shí)際上筆者在 VisualCMCS 中也正是這樣做的)。當(dāng)然也可以通過模板化避免 1)中的子類創(chuàng)建子類,其方法就是將具體 Product 類作為模板參數(shù),實(shí)現(xiàn)起來也很簡(jiǎn)單。

可以看出,工廠模式對(duì)于對(duì)象的創(chuàng)建給予開發(fā)人員提供了很好的實(shí)現(xiàn)策略,但是工廠模式僅僅局限于一類類(就是說 Product 是一類,有一個(gè)共同的基類),如果我們要為不同類的類提供一個(gè)對(duì)象創(chuàng)建的接口,那就要用 Abstract工廠了。

相關(guān)文章

  • C語言實(shí)現(xiàn)三子棋游戲(棋盤可變)

    C語言實(shí)現(xiàn)三子棋游戲(棋盤可變)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋游戲,棋盤可變,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++編程之?std::forward使用例子

    C++編程之?std::forward使用例子

    std::forward?是一個(gè)?C++11?中的模板函數(shù),其主要作用是在模板函數(shù)或模板類中,將一個(gè)參數(shù)以“原樣”(forward)的方式轉(zhuǎn)發(fā)給另一個(gè)函數(shù),這篇文章主要介紹了C++編程之?std::forward,需要的朋友可以參考下
    2023-03-03
  • 基于C++自動(dòng)化編譯工具的使用詳解

    基于C++自動(dòng)化編譯工具的使用詳解

    本篇文章是對(duì)C++中自動(dòng)化編譯工具的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++與QML交互的項(xiàng)目實(shí)踐

    C++與QML交互的項(xiàng)目實(shí)踐

    本文主要介紹了C++與QML交互的項(xiàng)目實(shí)踐,將詳細(xì)介紹C++與QML的交互方式,包括在QML中調(diào)用C++函數(shù)和在C++中訪問QML元素,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • C++實(shí)現(xiàn)通訊錄功能

    C++實(shí)現(xiàn)通訊錄功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 一步步從底層入手搞定C++引用與內(nèi)聯(lián)函數(shù)

    一步步從底層入手搞定C++引用與內(nèi)聯(lián)函數(shù)

    內(nèi)聯(lián)函數(shù)是代碼插入到調(diào)用者代碼處的函數(shù),內(nèi)聯(lián)函數(shù)通過避免被調(diào)用的開銷來提高執(zhí)行效率,下面這篇文章主要給大家介紹了關(guān)于如何從底層入手搞定C++引用與內(nèi)聯(lián)函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • C語言在輸入輸出時(shí)遇到的常見問題總結(jié)

    C語言在輸入輸出時(shí)遇到的常見問題總結(jié)

    大家在平時(shí)的做題中是否會(huì)遇到和我一樣的煩惱,題目的代碼已經(jīng)基本完成,但是在輸出時(shí)候,總是和題目給出的樣例輸出格式不同?,導(dǎo)致題目不能通過。為了解決這一煩惱,我總結(jié)了以下幾點(diǎn),需要的可以參考一下
    2022-09-09
  • 淺談C++STL之雙端隊(duì)列容器

    淺談C++STL之雙端隊(duì)列容器

    deque雙端隊(duì)列容器與vector很類似,采用線性表順序存儲(chǔ)結(jié)構(gòu)。但與vector區(qū)別,deque采用分塊的線性存儲(chǔ)結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù),每塊的大小一般為512B,將之稱為deque塊,所有的deque塊使用一個(gè)map塊進(jìn)行管理,每個(gè)map數(shù)據(jù)項(xiàng)記錄各個(gè)deque塊的首地址。
    2021-06-06
  • 淺談C語言結(jié)構(gòu)體

    淺談C語言結(jié)構(gòu)體

    本文主要介紹C語言 結(jié)構(gòu)體的知識(shí),學(xué)習(xí)C語言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下
    2021-10-10
  • C++中用棧來判斷括號(hào)字符串匹配問題的實(shí)現(xiàn)方法

    C++中用棧來判斷括號(hào)字符串匹配問題的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++中用棧來判斷括號(hào)字符串匹配問題的實(shí)現(xiàn)方法,是一個(gè)比較實(shí)用的算法技巧,包含了關(guān)于棧的基本操作,需要的朋友可以參考下
    2014-08-08

最新評(píng)論