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

0 引言

0.1 目的

       本文檔給出設計模式之——AbstractFactory模式的簡化詮釋,并給出其C++實現。

0.2 說明

Project

Design Pattern Explanation(By K_Eckel)

Authorization

Free Distributed but Ownership Reserved

Date

Test Bed

MS Visual C++ 6.0

0.3 參考

       在本文檔的寫作中,參考了以下的資源,在此列出表示感謝:

u       書籍

[GoF 2000]:GoF,Design Patterns-Elements of Reusable Object-Oriented Software

Addison-Wesley 2000/9.

        [Martine 2003]:Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.

0.4 聯系作者

Author

K_Eckel

State

Candidate for Master’s Degree School of

E_mail

frwei@whu.edu.cn  

2 AbstractFactory模式

2.1 問題

       假設我們要開發一款游戲,當然為了吸引更多的人玩,游戲難度不能太大(讓大家都沒有信心了,估計游戲也就沒有前途了),但是也不能太簡單(沒有挑戰性也不符合玩家的心理)。于是我們就可以采用這樣一種處理策略:為游戲設立等級,初級、中級、高級甚至有BT級。假設也是過關的游戲,每個關卡都有一些怪物(monster)守著,玩家要把這些怪 物干掉才可以過關。作為開發者,我們就不得不創建怪物的類,然后初級怪物、中級怪物等都繼承自怪物類(當然不同種類的則需要另創建類,但是模式相同)。在 每個關卡,我們都要創建怪物的實例,例如初級就創建初級怪物(有很多種類)、中級創建中級怪物等。可以想象在這個系統中,將會有成千上萬的怪物實例要創 建,問題是還要保證創建的時候不會出錯:初級不能創建BT級的怪物(玩家就郁悶了,玩家一郁悶,游戲也就掛掛了),反之也不可以。

       AbstractFactory模式就是用來解決這類問題的:要創建一組相關或者相互依賴的對象。

2.2 模式選擇

       AbstractFactory模式典型的結構圖為:


2-1AbstractFactoryPattern結構圖

       AbstractFactory模式關鍵就是將這一組對象的創建封裝到一個用于創建對象的類(ConcreteFactory)中,維護這樣一個創建類總比維護n多相關對象的創建過程要簡單的多。

2.3 實現

       AbstractFactory模式的實現比較簡單,這里為了方便初學者的學習和參考,將給出完整的實現代碼(所有代碼采用C++實現,并在VC 6.0下測試運行)。

代碼片斷1Product.h
//Product.h

#ifndef _PRODUCT_H_
#define _PRODUCT_H_

class AbstractProductA
{
public:
 virtual ~AbstractProductA();

protected:
 AbstractProductA();

private:

};

class AbstractProductB
{
public:
 virtual ~AbstractProductB();

protected:
 AbstractProductB();

private:

};

class ProductA1:public AbstractProductA
{
public:
 ProductA1();

 ~ProductA1();

protected:

private:

};

class ProductA2:public AbstractProductA
{
public:
 ProductA2();

 ~ProductA2();

protected:

private:

};

class ProductB1:public AbstractProductB
{
public:
 ProductB1();

 ~ProductB1();

protected:

private:

};

class ProductB2:public AbstractProductB
{
public:
 ProductB2();

 ~ProductB2();

protected:

private:

};

#endif //~_PRODUCT_H_

代碼片斷2Product.cpp
//Product.cpp

#include "Product.h"

#include <iostream>
using namespace std;

AbstractProductA::AbstractProductA()
{

}

AbstractProductA::~AbstractProductA()
{

}

AbstractProductB::AbstractProductB()
{

}

AbstractProductB::~AbstractProductB()
{

}

ProductA1::ProductA1()
{
 cout<<"ProductA1..."<<endl;
}

ProductA1::~ProductA1()
{

}

ProductA2::ProductA2()
{
 cout<<"ProductA2..."<<endl;
}

ProductA2::~ProductA2()
{

}

ProductB1::ProductB1()
{
 cout<<"ProductB1..."<<endl;
}

ProductB1::~ProductB1()
{

}

ProductB2::ProductB2()
{
 cout<<"ProductB2..."<<endl;
}

ProductB2::~ProductB2()
{

}

代碼片斷3AbstractFactory.h
//AbstractFactory.h

#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_

class AbstractProductA;
class AbstractProductB;

class AbstractFactory
{
public:
 virtual ~AbstractFactory();

 virtual AbstractProductA* CreateProductA() = 0;

 virtual AbstractProductB* CreateProductB() = 0;

protected:
 AbstractFactory();

private:

};

class ConcreteFactory1:public AbstractFactory
{
public:
 ConcreteFactory1();

 ~ConcreteFactory1();

 AbstractProductA* CreateProductA();

 AbstractProductB* CreateProductB();

protected:

private:

};

class ConcreteFactory2:public AbstractFactory
{
public:
 ConcreteFactory2();

 ~ConcreteFactory2();

 AbstractProductA* CreateProductA();

 AbstractProductB* CreateProductB();

protected:

private:

};
#endif //~_ABSTRACTFACTORY_H_

代碼片斷4AbstractFactory.cpp
//AbstractFactory.cpp

#include "AbstractFactory.h"
#include "Product.h"

#include <iostream>
using namespace std;

AbstractFactory::AbstractFactory()
{

}

AbstractFactory::~AbstractFactory()
{

}

ConcreteFactory1::ConcreteFactory1()
{

}

ConcreteFactory1::~ConcreteFactory1()
{

}

AbstractProductA* ConcreteFactory1::CreateProductA()
{
 return new ProductA1();
}

AbstractProductB* ConcreteFactory1::CreateProductB()
{
 return new ProductB1();
}

ConcreteFactory2::ConcreteFactory2()
{

}

ConcreteFactory2::~ConcreteFactory2()
{

}

AbstractProductA* ConcreteFactory2::CreateProductA()
{
 return new ProductA2();
}

AbstractProductB* ConcreteFactory2::CreateProductB()
{
 return new ProductB2();
}

代碼片斷5main.cpp
//main.cpp

#include "AbstractFactory.h"

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
 AbstractFactory* cf1 = new ConcreteFactory1();

 cf1->CreateProductA();
 cf1->CreateProductB();

 AbstractFactory* cf2 = new ConcreteFactory2();
 cf2->CreateProductA();
 cf2->CreateProductB();

 return 0;
}

       AbstractFactory模式的實現代碼很簡單,在測試程序中可以看到,當我們要創建一組對象(ProductA1,ProductA2)的時候我們只用維護一個創建對象(ConcreteFactory1),大大簡化了維護的成本和工作。

2.4 討論

       AbstractFactory模式和Factory模式的區別是初學(使用)設計模式時候的一個容易引起困惑的地方。實際上,AbstractFactory模式是為創建一組(有多類)相關或依賴的對象提供創建接口,而Factory模式正如我在相應的文檔中分析的是為一類對象提供創建接口或延遲對象的創建到子類中實現。并且可以看到,AbstractFactory模式通常都是使用Factory模式實現(ConcreteFactory1)。


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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导航| 亚洲精品在线三区| 欧美国产综合视频| 日韩视频久久| 一本色道久久加勒比精品| 欧美三级在线| 亚洲欧美成人精品| 欧美一区二区网站| 亚洲高清视频的网址| 亚洲成人资源网| 欧美日韩天天操| 性久久久久久久久| 久久这里只有精品视频首页| 亚洲级视频在线观看免费1级| 9人人澡人人爽人人精品| 国产精品毛片| 欧美成年网站| 国产欧美日韩伦理| 亚洲国产黄色| 国产视频精品va久久久久久| 欧美高清不卡| 国产情人节一区| 一本色道久久88综合日韩精品| 国内精品免费在线观看| 一区二区三区产品免费精品久久75| 狠狠色丁香久久综合频道| 日韩视频―中文字幕| 在线观看视频欧美| 久久成人一区| 美女视频网站黄色亚洲| 国产深夜精品福利| 午夜在线视频一区二区区别| 久久久噜噜噜久噜久久| 亚洲一区二区在线播放| 模特精品裸拍一区| 蜜桃伊人久久| 欧美一区二区三区免费在线看| 亚洲免费伊人电影在线观看av| 欧美日韩国产小视频在线观看| 久久www成人_看片免费不卡| 国产精品视频精品| 午夜亚洲一区| 一区二区激情| 亚洲国产欧美一区| 久久久精品免费视频| 亚洲一本大道在线| 亚洲人成啪啪网站| 揄拍成人国产精品视频| 国产精品网站视频| 国产精品美女| 国产精品综合色区在线观看| 欧美亚洲视频在线观看| 最新国产の精品合集bt伙计| 欧美有码在线视频| 在线午夜精品| 在线观看欧美黄色| 国产精品久久久久久久久久久久| 欧美一区二区三区日韩视频| 亚洲第一免费播放区| 久久国产精品一区二区三区四区| 亚洲精品美女| 一区二区三区在线免费观看| 欧美香蕉视频| 美女精品网站| 亚洲一区三区在线观看| 欧美国产一区二区| 欧美在线黄色| 久久久久成人网| 久久婷婷人人澡人人喊人人爽| 亚洲欧美激情四射在线日 | 久久免费高清视频| 亚洲欧美日韩国产一区二区| 亚洲乱码国产乱码精品精可以看 | 久久久久久久久岛国免费| 亚洲精品一二三| 亚洲激情社区| 亚洲高清在线观看一区| 欧美黑人多人双交| 欧美激情bt| 亚洲精品在线免费| 中日韩高清电影网| 久久不射电影网| 欧美国产成人在线| 欧美日韩综合在线| 国产精品久久久久久久久免费桃花 | 欧美黑人多人双交| 欧美喷潮久久久xxxxx| 欧美国产精品一区| 国产精品视频999| 亚洲第一福利视频| 亚洲欧美国内爽妇网| 久久精品视频在线看| 蜜臀99久久精品久久久久久软件| 亚洲国产综合91精品麻豆| 99热这里只有精品8| 性高湖久久久久久久久| 欧美喷潮久久久xxxxx| 国产一区视频在线看| 久久国产精品毛片| 香蕉成人伊视频在线观看| 国产欧美日韩| 欧美aa在线视频| 欧美日韩一区二区三区四区在线观看 | 亚洲美女性视频| 久久久精品国产免大香伊 | 欧美日韩国产成人在线免费 | 欧美成人一二三| 欧美在线视频观看| 国产精品国产精品| 亚洲午夜精品久久久久久浪潮| 欧美chengren| 欧美国产先锋| 一区二区欧美国产| 亚洲第一福利视频| 久久久在线视频| 亚洲欧洲精品天堂一级| 91久久在线观看| 欧美少妇一区二区| 欧美在线视频二区| 亚洲女爱视频在线| 国产日韩在线视频| 亚洲第一精品夜夜躁人人躁| 久久久久久综合| 欧美日韩一区二区免费视频| 久久福利视频导航| 国产精品成人观看视频国产奇米| 嫩草伊人久久精品少妇av杨幂| 亚洲一区制服诱惑| 久久精品二区三区| 午夜免费在线观看精品视频| 欧美成人精品一区二区| 久久精品2019中文字幕| 欧美精品一卡二卡| 欧美国产日韩精品| 在线不卡中文字幕播放| 欧美在线你懂的| 久久男人资源视频| 韩国成人福利片在线播放| 性8sex亚洲区入口| 久久夜色精品国产亚洲aⅴ| 亚洲图片欧美日产| 国产视频在线观看一区二区| 国产精品色一区二区三区| 一区二区三区高清视频在线观看| 欧美一区二区高清在线观看| 久久噜噜噜精品国产亚洲综合| 久久精品一区二区三区不卡| 亚洲破处大片| 欧美日韩在线影院| 午夜精品一区二区三区在线播放| 欧美大片免费观看在线观看网站推荐| 亚洲欧美日韩一区二区在线 | 欧美在线1区| 欧美福利一区二区| 欧美巨乳在线| 午夜精品久久久久久久99热浪潮| 亚洲人成网站999久久久综合| 欧美日韩不卡| 久久aⅴ国产欧美74aaa| 久久夜色撩人精品| 国产一区二区三区在线观看免费| 亚洲欧洲综合| 欧美激情视频免费观看| 亚洲精品自在久久| 亚洲电影免费观看高清完整版在线| 亚洲高清自拍| 亚洲一区二区三区中文字幕在线| 亚洲欧美日韩久久精品| 久久久福利视频| 亚洲精品美女在线观看| 亚洲一区二区三区三| 亚洲巨乳在线| 在线观看日韩精品| 国产在线播放一区二区三区| 亚洲区免费影片| 国产真实久久| 国产精品视频久久久| 欧美视频精品一区| 国产精品久久久久久久app| 欧美久久一级| 欧美体内she精视频在线观看| 欧美日韩国产区一| 欧美日韩三级| **性色生活片久久毛片| 亚洲人成在线播放| 亚洲成色777777在线观看影院| 久热国产精品视频| 久久人人九九| 能在线观看的日韩av| 嫩草影视亚洲| 亚洲精品乱码| 亚洲小说春色综合另类电影| 欧美一级播放| 欧美承认网站| 91久久久精品| 99视频超级精品| 亚洲在线免费| 久久精品亚洲| 你懂的国产精品永久在线|