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

The Programming world of Alex

設計模式之FactoryMethod模式

FactoryMethod模式屬于23種設計模式中的創建型模式,解決的是如何“new”的問題。

引例:
還是先從簡單的例子入手FactoryMethod模式吧,現在需要一個汽車測試的環境來對汽車進行測試,我們很容易會這樣設計
 1//////////////////////////////////////////////
 2//汽車類
 3class Car
 4{
 5public:
 6    void Startup(){}
 7    void Run() {}
 8    void Turn() {}
 9    void Stop() {}
10}
;
11
12//////////////////////////////////////////////
13//汽車測試環境
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}
;


非常簡單的設計,但是存在問題,如果我們要對紅旗車,東風車進行測試,那么怎么辦?
有了之前那些模式的經驗,再回想下面向對象的特性。。。
“多態”!將Car設計成為一個抽象類,DoTest里全部使用抽象類的指針來操作,那不就可以應對不同類型的汽車了嗎?
于是有了以下的代碼:(注意DoTest的參數,這樣使用才可以讓用戶指定車輛的類型)
//////////////////////////////////////////////
//抽象汽車類
class AbstractCar
{
public:
    
virtual void Startup() = 0;
    
virtual void Run() = 0;
    
virtual void Turn() = 0;
    
virtual void Stop() =0;
}
;

//////////////////////////////////////////////
//具體汽車類——紅旗車
class HongqiCar : public AbstractCar
{
public:
//具體實現抽象汽車類的四個方法.
}
;

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

}
;


到此為止的設計其實還是不錯的,能夠應對不同類型的汽車變化,如果增加了新的汽車類型也完全不用修改現有代碼,只需要增加代碼就可以了
但如果測試車輛不止一輛怎么辦?以上設計的缺陷就在于DoTest的參數,參數的個數對應于測試車輛的數量,測試數量不確定是很正常的事情。
再想想面向對象有什么特性。。。“封裝”!用一個類專門用來封裝汽車的創建就搞定這個問題了嘛!這個類起個特別的名字就是“工廠類”。

動機:
軟件系統中,我們經常面對“某個對象”的創建工作;由于需求的變化,這個對象經常面臨劇烈的變化,但他有相對穩定的接口。
為了抵抗這種變化,提出“封裝變化點”的思想,采用“封裝”機制將其“變化部分”隔離出來,從而保證“其他依賴該對象的對象”不隨需求變化而變化。

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

設計思路:
還是先看看UML圖

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

總結:
1.OO的“多態”。大部分的設計模式都會體現出OO的這個原則,他的作用就是“推遲實現”,將一個類的實例化推遲到子類,從而解決不同類型對象的創建問題。
2.OO的“封裝”。工廠方法另一個重要思想,工廠類把創建工作封裝起來,這樣用戶就可以多次使用,解決了同時創建多個對象的問題。
3.工廠方法和抽象工廠的區別:其實抽象工廠模式可以看作工廠模式的一個特例。工廠模式在工廠類中只創建一種類型的對象,如果在工廠類中擁有創建多種類型的對象的方法(比如創建引擎,創建車門,創建車燈。。。)那其實不就是之前討論的抽象工廠模式嘛?
4.當我們創建一系列有繼承關系的類時都可以考慮使用工廠方法。回想之前項目中使用的Ogre,工廠方法使用非常廣泛,幾乎所有對象都不是new出來的,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) 評論(7)  編輯 收藏 引用 所屬分類: 設計模式

評論

# re: 設計模式之FactoryMethod模式 2009-04-09 09:22 yleesun

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

# re: 設計模式之FactoryMethod模式 2009-04-09 09:42 星綻紫輝

關注中、。。。  回復  更多評論   

# re: 設計模式之FactoryMethod模式 2009-04-09 09:53 Alex@VCC

謝謝大家的關注,這些隨筆全是我在學習后的一些整理,如果能為大家的學習和工作帶來幫助我實在太開心了。
有時間的話我會陸續整理其他的一些模式。

學習設計模式關鍵是如何應用,鄙人才疏學淺,還望大家多多交流  回復  更多評論   

# re: 設計模式之FactoryMethod模式 2009-04-12 11:12 caoji

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

看看這篇是否有啟發。

國內寫設計模式的都太拘泥GOF的東西,其實世界很大的。

有空再看看loki吧。  回復  更多評論   

# re: 設計模式之FactoryMethod模式 2009-04-12 20:42 Alex@VCC

@caoji
我不是寫設計模式,只是做一些學習筆記罷了,呵呵
GOF應該說還是比較經典的,對我們這些剛接觸設計模式的人來說算是一個比較好的起點吧。設計模式雖然說有著各種各樣的模式,但最重要的還是當中面向對象的思想,我覺得這點比死記各種模式重要多了

你的那篇我仔細拜讀過了,使用函數指針也是不錯的方法:)  回復  更多評論   

# re: 設計模式之FactoryMethod模式 2009-04-13 08:51 caoji

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

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

我建議是拿來主義,像boost、loki這樣的庫,用就可以了。

但是設計模式應用非常廣泛。應該說C++還是老了些。許多新的語言特征都沒有。以至于搞個工廠模式還要用函數指針。

設計模式的層次要高于面向對象,它教你怎么組織對象。具體問題要具體分析。我還是挺支持設計模式的  回復  更多評論   

# re: 設計模式之FactoryMethod模式 2009-04-14 11:09 yleesun

希望繼續更新設計模式其他的模式心得。  回復  更多評論   

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

導航

統計

常用鏈接

留言簿(5)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久福利精品| 亚洲国产精品国自产拍av秋霞| 亚洲一区三区视频在线观看| 老巨人导航500精品| 亚洲香蕉网站| 欧美日韩国产综合视频在线观看 | 欧美日韩免费观看一区二区三区| 伊人精品在线| 久久一综合视频| 亚洲伊人久久综合| 亚洲激情在线激情| 欧美国产日产韩国视频| 亚洲国产成人不卡| 欧美一区三区三区高中清蜜桃| 欧美亚洲午夜视频在线观看| 欧美日韩成人一区| 亚洲第一黄色网| 亚洲欧美视频一区二区三区| 国产精品毛片va一区二区三区 | 欧美日韩亚洲视频| 国产综合色产在线精品| 久久综合色影院| 蜜桃伊人久久| 最新亚洲激情| 亚洲欧美日韩国产一区二区| 欧美午夜女人视频在线| 久久久久久久一区二区三区| 久久精品亚洲一区二区三区浴池 | 欧美xxx在线观看| 亚洲国产成人av| 亚洲欧美精品suv| 亚洲精选一区二区| 欧美片第1页综合| 欧美午夜精彩| 制服丝袜亚洲播放| 一区二区不卡在线视频 午夜欧美不卡在 | 玖玖视频精品| 美女91精品| 99成人在线| 亚洲午夜一区二区三区| 黄色精品在线看| 亚洲国产另类精品专区 | 韩日欧美一区二区三区| 欧美高清不卡| 国产精品久久久久av免费| 久久九九99视频| 欧美精品一区二| 亚洲综合久久久久| 伊人蜜桃色噜噜激情综合| 亚洲国产精品t66y| 国产欧美69| 亚洲国产欧美一区二区三区丁香婷| 欧美视频在线观看一区二区| 久久亚洲国产精品日日av夜夜| 欧美激情精品久久久久| 欧美在线播放高清精品| 欧美精品一区二区蜜臀亚洲| 久久激情视频久久| 欧美日韩国产精品成人| 玖玖视频精品| 国产农村妇女毛片精品久久麻豆| 亚洲国产91精品在线观看| 国产精品久久婷婷六月丁香| 亚洲第一页自拍| 韩国精品一区二区三区| 亚洲天天影视| 夜久久久久久| 欧美sm重口味系列视频在线观看| 欧美一区二区三区四区夜夜大片 | 美女黄色成人网| 久久精品一级爱片| 国产精品嫩草影院一区二区| 亚洲观看高清完整版在线观看| 国产日韩亚洲欧美精品| 亚洲欧洲综合| 亚洲一区在线看| 亚洲精品乱码久久久久久黑人| 日韩视频一区二区在线观看| 影音先锋久久资源网| 亚洲人成小说网站色在线| 国产亚洲精品资源在线26u| 亚洲社区在线观看| 日韩午夜在线播放| 蜜臀久久久99精品久久久久久| 久久天天躁夜夜躁狠狠躁2022 | 久久久美女艺术照精彩视频福利播放| 欧美日韩中文| 99riav1国产精品视频| 日韩午夜在线电影| 欧美日本一道本| 亚洲精品资源美女情侣酒店| 欧美a级片网站| 欧美高清自拍一区| 亚洲电影欧美电影有声小说| 久久久综合免费视频| 鲁大师影院一区二区三区| 在线观看国产一区二区| 亚洲伦理自拍| 尤物99国产成人精品视频| 亚洲免费在线观看| 亚洲一区二区三区涩| 欧美激情视频在线播放| 免费欧美高清视频| 亚洲第一综合天堂另类专| 亚洲欧美日韩在线观看a三区 | 亚洲一区二区三区久久| 久久aⅴ国产紧身牛仔裤| 欧美日本免费| 亚洲免费av网站| 亚洲私人影吧| 欧美性色aⅴ视频一区日韩精品| 日韩亚洲欧美成人| 午夜精品一区二区在线观看| 国产精品视频福利| 亚洲在线观看免费视频| 午夜精品美女自拍福到在线| 国产精品色婷婷久久58| 久久国产一区二区三区| 亚洲国产欧美精品| 亚洲一区久久久| 国产一区二区三区免费在线观看 | 国产日本欧美视频| 久久九九免费视频| 欧美韩国在线| 午夜免费日韩视频| 亚洲高清123| 国产精品久久久久久久久| 久久久久久久一区二区三区| 亚洲高清一区二区三区| 小黄鸭精品aⅴ导航网站入口| 伊人久久亚洲美女图片| 欧美日本亚洲韩国国产| 久久9热精品视频| 一区二区精品国产| 久久夜色精品国产欧美乱| 亚洲美女av黄| 欧美午夜在线观看| 久久久久成人网| 亚洲一级一区| 亚洲第一毛片| 亚洲综合视频在线| 激情欧美日韩一区| 欧美色中文字幕| 久久婷婷麻豆| 一级成人国产| 亚洲精品看片| 免费人成网站在线观看欧美高清| 亚洲天堂成人| 亚洲高清av| 精品不卡在线| 国产日韩欧美高清| 国产精品成人观看视频免费 | 久久精品欧美| 亚洲天堂av在线免费| 日韩视频免费在线观看| 黄色精品一区二区| 国产日韩欧美在线| 国产精品久久久久久av下载红粉| 欧美肥婆bbw| 麻豆成人av| 欧美激情一区二区三区| 国产一区二区三区视频在线观看| 欧美黑人在线观看| 久久精品国产一区二区三区免费看 | 亚洲欧洲日本在线| 欧美成人精品三级在线观看| 欧美一区二区在线看| 亚洲午夜影视影院在线观看| av成人免费| 99国产精品久久久久老师| 亚洲精品日产精品乱码不卡| 亚洲国产视频一区| 亚洲国产高清在线观看视频| 影音先锋中文字幕一区| 激情欧美丁香| 亚洲国产精品123| 亚洲电影av| 亚洲精品美女久久7777777| 91久久精品一区二区别| 亚洲精品社区| 99热在这里有精品免费| 亚洲视频电影在线| 亚洲欧美一区二区原创| 欧美一级精品大片| 欧美中日韩免费视频| 久久国产婷婷国产香蕉| 久久手机精品视频| 欧美成人a∨高清免费观看| 欧美激情视频给我| 亚洲黄色天堂| 在线一区二区三区做爰视频网站| 亚洲视频中文| 欧美一区日韩一区| 欧美sm视频| 国产精品二区在线观看| 国产在线一区二区三区四区| 亚洲国产va精品久久久不卡综合| 亚洲毛片一区二区| 午夜视频在线观看一区二区三区| 久久亚洲精品视频|