青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Programming world of Alex

設(shè)計(jì)模式之FactoryMethod模式

FactoryMethod模式屬于23種設(shè)計(jì)模式中的創(chuàng)建型模式,解決的是如何“new”的問題。

引例:
還是先從簡(jiǎn)單的例子入手FactoryMethod模式吧,現(xiàn)在需要一個(gè)汽車測(cè)試的環(huán)境來(lái)對(duì)汽車進(jìn)行測(cè)試,我們很容易會(huì)這樣設(shè)計(jì)
 1//////////////////////////////////////////////
 2//汽車類
 3class Car
 4{
 5public:
 6    void Startup(){}
 7    void Run() {}
 8    void Turn() {}
 9    void Stop() {}
10}
;
11
12//////////////////////////////////////////////
13//汽車測(cè)試環(huán)境
14class CarTestFramework
15{
16public:
17    void DoTest()
18    {
19        Car* car = new Car();
20        car->Startup();
21        car->Run();
22        car->Turn();
23        car->Stop();
24    }

25}
;


非常簡(jiǎn)單的設(shè)計(jì),但是存在問題,如果我們要對(duì)紅旗車,東風(fēng)車進(jìn)行測(cè)試,那么怎么辦?
有了之前那些模式的經(jīng)驗(yàn),再回想下面向?qū)ο蟮奶匦浴!!?br>“多態(tài)”!將Car設(shè)計(jì)成為一個(gè)抽象類,DoTest里全部使用抽象類的指針來(lái)操作,那不就可以應(yīng)對(duì)不同類型的汽車了嗎?
于是有了以下的代碼:(注意DoTest的參數(shù),這樣使用才可以讓用戶指定車輛的類型)
//////////////////////////////////////////////
//抽象汽車類
class AbstractCar
{
public:
    
virtual void Startup() = 0;
    
virtual void Run() = 0;
    
virtual void Turn() = 0;
    
virtual void Stop() =0;
}
;

//////////////////////////////////////////////
//具體汽車類——紅旗車
class HongqiCar : public AbstractCar
{
public:
//具體實(shí)現(xiàn)抽象汽車類的四個(gè)方法.
}
;

//////////////////////////////////////////////
//汽車測(cè)試環(huán)境
class CarTestFramework
{
public:
    
void DoTest(AbstractCar* car)
    
{
        car
->Startup();
        car
->Run();
        car
->Turn();
        car
->Stop();
    }

}
;


到此為止的設(shè)計(jì)其實(shí)還是不錯(cuò)的,能夠應(yīng)對(duì)不同類型的汽車變化,如果增加了新的汽車類型也完全不用修改現(xiàn)有代碼,只需要增加代碼就可以了
但如果測(cè)試車輛不止一輛怎么辦?以上設(shè)計(jì)的缺陷就在于DoTest的參數(shù),參數(shù)的個(gè)數(shù)對(duì)應(yīng)于測(cè)試車輛的數(shù)量,測(cè)試數(shù)量不確定是很正常的事情。
再想想面向?qū)ο笥惺裁刺匦浴!!?#8220;封裝”!用一個(gè)類專門用來(lái)封裝汽車的創(chuàng)建就搞定這個(gè)問題了嘛!這個(gè)類起個(gè)特別的名字就是“工廠類”。

動(dòng)機(jī):
軟件系統(tǒng)中,我們經(jīng)常面對(duì)“某個(gè)對(duì)象”的創(chuàng)建工作;由于需求的變化,這個(gè)對(duì)象經(jīng)常面臨劇烈的變化,但他有相對(duì)穩(wěn)定的接口。
為了抵抗這種變化,提出“封裝變化點(diǎn)”的思想,采用“封裝”機(jī)制將其“變化部分”隔離出來(lái),從而保證“其他依賴該對(duì)象的對(duì)象”不隨需求變化而變化。

意圖:
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪個(gè)類。Factory Method使得一個(gè)類的實(shí)例化延遲到子類。(GoF23)

設(shè)計(jì)思路:
還是先看看UML圖

如果只看左邊的Product和ConcreteProduct部分,那么這就是我們的第2種設(shè)計(jì)方案。
FatoryMethod在Product和ConcreteProduct的基礎(chǔ)上加上了Creator和ConcreteCreator,分別就是Factory和ConcreteFactory。Factory有個(gè)非常重要的函數(shù)CreateProduct()(就是圖中的AnOperation),它將對(duì)象的創(chuàng)建工作封裝了起來(lái)。

總結(jié):
1.OO的“多態(tài)”。大部分的設(shè)計(jì)模式都會(huì)體現(xiàn)出OO的這個(gè)原則,他的作用就是“推遲實(shí)現(xiàn)”,將一個(gè)類的實(shí)例化推遲到子類,從而解決不同類型對(duì)象的創(chuàng)建問題。
2.OO的“封裝”。工廠方法另一個(gè)重要思想,工廠類把創(chuàng)建工作封裝起來(lái),這樣用戶就可以多次使用,解決了同時(shí)創(chuàng)建多個(gè)對(duì)象的問題。
3.工廠方法和抽象工廠的區(qū)別:其實(shí)抽象工廠模式可以看作工廠模式的一個(gè)特例。工廠模式在工廠類中只創(chuàng)建一種類型的對(duì)象,如果在工廠類中擁有創(chuàng)建多種類型的對(duì)象的方法(比如創(chuàng)建引擎,創(chuàng)建車門,創(chuàng)建車燈。。。)那其實(shí)不就是之前討論的抽象工廠模式嘛?
4.當(dāng)我們創(chuàng)建一系列有繼承關(guān)系的類時(shí)都可以考慮使用工廠方法。回想之前項(xiàng)目中使用的Ogre,工廠方法使用非常廣泛,幾乎所有對(duì)象都不是new出來(lái)的,Ogre提供了許許多多的CreateXX方法。

自己做的示例代碼,僅供參考:
AbstractFactory.h
1#pragma once
2#include "AbstractCar.h"
3
4class AbstractCarFactory
5{
6public:
7    virtual AbstractCar* CreateCar() = 0;
8}
;
AbstractCar.h
 1#pragma once
 2
 3class AbstractCar
 4{
 5public:
 6    virtual void Startup() = 0;
 7    virtual void Run() = 0;
 8    virtual void Turn() = 0;
 9    virtual void Stop() = 0;
10}
;
11
HongqiCarFactory.h
 1#pragma once
 2#include "AbstractCarFactory.h"
 3#include "HongqiCar.h"
 4
 5class HongqiCarFactory :public AbstractCarFactory
 6{
 7public:
 8    virtual AbstractCar* CreateCar()
 9    {
10        return new HongqiCar();
11    }

12}
;
13
HongqiCar.h
 1#pragma once
 2#include "AbstractCar.h"
 3#include <iostream>
 4using namespace std;
 5
 6class HongqiCar : public AbstractCar
 7{
 8public:
 9    virtual void Startup()
10    {
11        cout<<"HongqiCar : Startup()"<<endl;
12    }

13    virtual void Run()
14    {
15        cout<<"HongqiCar : Run()"<<endl;
16    }

17    virtual void Turn()
18    {
19        cout<<"HongqiCar : Turn()"<<endl;
20    }

21    virtual void Stop()
22    {
23        cout<<"HongqiCar : Stop()"<<endl;
24    }

25}
;
26
Main.cpp
 1//////////////////////////////////////////////////////////////////////////
 2// FactoryMethodTest for Factory Method Test
 3//////////////////////////////////////////////////////////////////////////
 4
 5#include "stdafx.h"
 6#include "AbstractCar.h"
 7#include "AbstractCarFactory.h"
 8#include "HongqiCar.h"
 9#include "HongqiCarFactory.h"
10#include <iostream>
11using namespace std;
12
13
14class CarTestFramework
15{
16public:
17    void DoTest(AbstractCarFactory* carFactory)
18    {
19        AbstractCar* car1 = carFactory->CreateCar();
20        cout<<"//////////////////////////////////////////////\n//Car1 Test\n//////////////////////////////////////////////"<<endl;
21        car1->Startup();
22        car1->Run();
23        car1->Turn();
24        car1->Stop();
25
26        AbstractCar* car2 = carFactory->CreateCar();
27        cout<<"\n//////////////////////////////////////////////\n//Car2 Test\n//////////////////////////////////////////////"<<endl;
28        car2->Startup();
29        car2->Run();
30        car2->Turn();
31        car2->Stop();
32    }

33}
;
34
35
36int _tmain(int argc, _TCHAR* argv[])
37{
38    CarTestFramework* carTestFramework = new CarTestFramework();
39    cout<<"Test the HongqiCar"<<endl;
40    carTestFramework->DoTest(new HongqiCarFactory());
41
42    return 0;
43}

44
45

posted on 2009-04-08 20:58 Alex@VCC 閱讀(1777) 評(píng)論(7)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式

評(píng)論

# re: 設(shè)計(jì)模式之FactoryMethod模式 2009-04-09 09:22 yleesun

非常感謝作者,我之前看過(guò)GOF的設(shè)計(jì)模式,當(dāng)時(shí)覺得很抽象,沒有能堅(jiān)持看下去。今日得見先生如此通俗易懂的描述,使我茅塞頓開,希望作者能把其他中的設(shè)計(jì)模式也能陸續(xù)分享,我將一直關(guān)注,非常感謝。  回復(fù)  更多評(píng)論   

# re: 設(shè)計(jì)模式之FactoryMethod模式 2009-04-09 09:42 星綻紫輝

關(guān)注中、。。。  回復(fù)  更多評(píng)論   

# re: 設(shè)計(jì)模式之FactoryMethod模式 2009-04-09 09:53 Alex@VCC

謝謝大家的關(guān)注,這些隨筆全是我在學(xué)習(xí)后的一些整理,如果能為大家的學(xué)習(xí)和工作帶來(lái)幫助我實(shí)在太開心了。
有時(shí)間的話我會(huì)陸續(xù)整理其他的一些模式。

學(xué)習(xí)設(shè)計(jì)模式關(guān)鍵是如何應(yīng)用,鄙人才疏學(xué)淺,還望大家多多交流  回復(fù)  更多評(píng)論   

# re: 設(shè)計(jì)模式之FactoryMethod模式 2009-04-12 11:12 caoji

http://blog.csdn.net/jicao/archive/2006/07/01/861343.aspx

看看這篇是否有啟發(fā)。

國(guó)內(nèi)寫設(shè)計(jì)模式的都太拘泥GOF的東西,其實(shí)世界很大的。

有空再看看loki吧。  回復(fù)  更多評(píng)論   

# re: 設(shè)計(jì)模式之FactoryMethod模式 2009-04-12 20:42 Alex@VCC

@caoji
我不是寫設(shè)計(jì)模式,只是做一些學(xué)習(xí)筆記罷了,呵呵
GOF應(yīng)該說(shuō)還是比較經(jīng)典的,對(duì)我們這些剛接觸設(shè)計(jì)模式的人來(lái)說(shuō)算是一個(gè)比較好的起點(diǎn)吧。設(shè)計(jì)模式雖然說(shuō)有著各種各樣的模式,但最重要的還是當(dāng)中面向?qū)ο蟮乃枷耄矣X得這點(diǎn)比死記各種模式重要多了

你的那篇我仔細(xì)拜讀過(guò)了,使用函數(shù)指針也是不錯(cuò)的方法:)  回復(fù)  更多評(píng)論   

# re: 設(shè)計(jì)模式之FactoryMethod模式 2009-04-13 08:51 caoji

GOF成書大概在1995年左右。GOF也只是提出了想法,并沒有具體的編碼實(shí)現(xiàn)。

此后十來(lái)年C++的發(fā)展是非常迅速的。Boost就是一例。但是boost不好懂,不花大量時(shí)間在泛型編程上,研究boost并沒有實(shí)際意義。

我建議是拿來(lái)主義,像boost、loki這樣的庫(kù),用就可以了。

但是設(shè)計(jì)模式應(yīng)用非常廣泛。應(yīng)該說(shuō)C++還是老了些。許多新的語(yǔ)言特征都沒有。以至于搞個(gè)工廠模式還要用函數(shù)指針。

設(shè)計(jì)模式的層次要高于面向?qū)ο螅棠阍趺唇M織對(duì)象。具體問題要具體分析。我還是挺支持設(shè)計(jì)模式的  回復(fù)  更多評(píng)論   

# re: 設(shè)計(jì)模式之FactoryMethod模式 2009-04-14 11:09 yleesun

希望繼續(xù)更新設(shè)計(jì)模式其他的模式心得。  回復(fù)  更多評(píng)論   

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(5)

隨筆分類

隨筆檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久久久久果冻传媒 | 夜夜夜久久久| 一本色道88久久加勒比精品 | 夜夜嗨av一区二区三区| 亚洲精品乱码久久久久久日本蜜臀 | 一区二区视频欧美| 99视频在线观看一区三区| 亚洲精品国精品久久99热一| 欧美日韩成人综合| 亚洲国产aⅴ天堂久久| 欧美一区二区精品| 日韩一区二区精品| 久久亚洲精品中文字幕冲田杏梨| 国产精品v欧美精品v日本精品动漫 | 国产亚洲精品美女| 亚洲欧美日本国产专区一区| 亚洲国产岛国毛片在线| 久久精品99久久香蕉国产色戒| 欧美性猛交99久久久久99按摩| 亚洲欧美另类在线| 久久久久9999亚洲精品| 欧美日韩国产精品自在自线| 亚洲欧美日韩网| 老牛国产精品一区的观看方式| 国产一区二区视频在线观看| 欧美成人在线免费视频| 久久久精品国产一区二区三区| 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品久久久蜜桃| 一区二区欧美在线观看| 欧美日韩一视频区二区| 正在播放欧美视频| 日韩一级黄色大片| 精品96久久久久久中文字幕无| 亚洲人成在线播放网站岛国| 国产日韩欧美视频| 久久人人97超碰国产公开结果| 亚洲欧美国产另类| 亚洲永久网站| 欧美日韩中文字幕在线| 一区二区三区视频在线播放| 欧美一区视频| 尤物yw午夜国产精品视频明星| 欧美不卡视频一区| 欧美精品一区二区三区久久久竹菊| 亚洲精品国产精品国自产观看 | 美女久久一区| 另类av导航| 久久精品国产第一区二区三区| 欧美一区二区三区免费视频| 一区二区高清在线| 欧美黑人在线播放| 亚洲欧美日韩网| 欧美日韩国产大片| 亚洲国产成人久久综合| 在线观看欧美亚洲| 久久精品视频网| 久久久精品国产免费观看同学| 老鸭窝毛片一区二区三区| 欧美一区久久| 国产精一区二区三区| 欧美成人在线影院| 亚洲成人在线观看视频| 99精品热视频只有精品10| 国产欧美日韩在线| 亚洲电影免费观看高清完整版在线观看 | 欧美激情aⅴ一区二区三区| 欧美日韩午夜在线| 亚洲精品国产欧美| 在线视频中文亚洲| 国产精品国产自产拍高清av| 日韩视频一区| 亚洲尤物视频在线| 蜜桃久久av| 欧美一区深夜视频| 国产亚洲精品福利| 久久影院亚洲| 亚洲福利在线看| 在线视频中文亚洲| 国产精品日韩在线观看| 亚洲精品视频一区| 亚洲国产成人午夜在线一区| 葵司免费一区二区三区四区五区| 欧美刺激午夜性久久久久久久| 亚洲国产欧美日韩精品| 欧美一区二区网站| 米奇777在线欧美播放| 亚洲三级色网| 国产精品日本一区二区| 久久大逼视频| 亚洲日本欧美日韩高观看| 亚洲一卡二卡三卡四卡五卡| 欧美99久久| 欧美韩日精品| 亚洲午夜一级| 在线日韩av| 欧美午夜一区二区福利视频| 先锋影音国产一区| 国产在线欧美日韩| 亚洲男女自偷自拍图片另类| 久久综合九色综合网站| 国产丝袜美腿一区二区三区| 久久精品国产精品亚洲| 最新国产拍偷乱拍精品| 亚洲乱码国产乱码精品精可以看| 久久综合九色九九| 中国成人在线视频| 午夜在线观看免费一区| 国产精品女主播| 亚洲一区二区三区视频播放| 欧美 日韩 国产 一区| 一区二区三区四区五区视频| 黑人巨大精品欧美一区二区小视频| 欧美亚洲系列| 亚洲精品小视频在线观看| 久久久久免费视频| 亚洲一区二区三区久久| 亚洲人成免费| 欧美午夜精品电影| 麻豆精品一区二区综合av| 亚洲欧美日韩国产综合| 美女精品国产| 亚洲字幕一区二区| 99ri日韩精品视频| 国产精品av一区二区| 男男成人高潮片免费网站| 欧美一区三区二区在线观看| 一本高清dvd不卡在线观看| 亚洲国产精品嫩草影院| 日韩天堂在线观看| 亚洲国产精品成人综合| 国产综合久久久久久鬼色| 国产精品一区在线播放| 欧美日韩亚洲一区二区三区在线| 嫩草国产精品入口| 久久久久一区二区三区| 久久er精品视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲一区二区三区视频| 一区二区三区日韩在线观看| 91久久一区二区| 亚洲区中文字幕| 亚洲精品乱码久久久久久日本蜜臀| 伊人蜜桃色噜噜激情综合| 一区二区视频免费完整版观看| 尤物网精品视频| 亚洲高清免费视频| 亚洲人成亚洲人成在线观看| 亚洲国产精品视频一区| 最新中文字幕亚洲| 亚洲三级色网| 亚洲特级片在线| 亚洲精美视频| 亚洲免费不卡| 亚洲一区二区三区四区五区午夜| 亚洲综合大片69999| 欧美一区二区三区精品| 久久精品亚洲一区| 噜噜噜在线观看免费视频日韩| 亚洲私人影吧| 新片速递亚洲合集欧美合集| 久久精品道一区二区三区| 久久综合婷婷| 亚洲欧洲在线免费| 一区二区三区免费观看| 亚洲欧美色婷婷| 免费视频一区二区三区在线观看| 欧美理论电影在线观看| 国产精品美女主播| 激情久久五月| 夜色激情一区二区| 欧美在线91| 一区二区三区精品国产| 午夜亚洲福利| 亚洲一区二区成人| 久久精品免费看| 亚洲激情专区| 性8sex亚洲区入口| 欧美激情成人在线| 国产拍揄自揄精品视频麻豆| 亚洲电影观看| 亚洲一区日韩在线| 免费永久网站黄欧美| 99国产精品久久| 久久视频在线免费观看| 欧美体内she精视频| 精品88久久久久88久久久| 亚洲精选国产| 久久亚洲不卡| 亚洲伊人一本大道中文字幕| 免费观看在线综合色| 国产伦精品一区二区三区高清| 亚洲人久久久| 老司机67194精品线观看| 一区二区三区日韩欧美精品| 美女精品国产| 好吊一区二区三区| 欧美专区18| 免费观看成人网| 亚洲欧美日本在线|