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

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>
            欧美精品日韩www.p站| 亚洲国产欧美久久| 国产亚洲精品久久久久婷婷瑜伽| 欧美日韩亚洲视频| 欧美性久久久| 国产三级精品三级| 亚洲黄色尤物视频| 在线视频精品| 久久国产黑丝| 亚洲国产成人精品久久| 亚洲乱码国产乱码精品精可以看| 亚洲小少妇裸体bbw| 久久久久久久综合| 欧美日韩一区在线观看视频| 国产一区二区三区黄| 亚洲韩国一区二区三区| 亚洲免费在线精品一区| 毛片精品免费在线观看| 99精品热视频只有精品10| 欧美一区二区三区四区高清| 欧美激情一区二区| 韩国自拍一区| 午夜精品国产更新| 亚洲国内精品在线| 久久久久一区二区三区四区| 欧美日韩精品在线视频| 精品成人乱色一区二区| 欧美在线电影| 亚洲毛片网站| 老司机免费视频久久| 国产精品一卡| 在线一区二区三区四区五区| 蜜臀91精品一区二区三区| 亚洲一区一卡| 欧美日韩一区精品| 亚洲精品免费一区二区三区| 久久久99国产精品免费| 一本大道久久a久久综合婷婷| 麻豆九一精品爱看视频在线观看免费| 国产日产高清欧美一区二区三区| 亚洲一区二区3| 最新成人av网站| 久久一区二区三区国产精品| 国产伦精品一区二区三区四区免费| 亚洲精品免费在线| 亚洲电影观看| 欧美va亚洲va香蕉在线| 午夜精品久久久久久久久久久久久| 免费观看在线综合| 激情综合激情| 久久中文欧美| 久久久久91| 一区二区在线看| 久久九九有精品国产23| 午夜国产精品视频| 国产三级欧美三级| 久久久久www| 久久aⅴ乱码一区二区三区| 国产精品影片在线观看| 午夜精品久久久久久久蜜桃app | 欧美一区二区三区在线观看视频| 亚洲色在线视频| 国产精品入口福利| 欧美亚洲一区二区在线| 亚洲自拍另类| 国产性做久久久久久| 久久精品麻豆| 久久婷婷综合激情| 91久久精品国产91久久性色tv| 欧美激情视频一区二区三区在线播放| 老司机免费视频一区二区| 亚洲激情啪啪| 亚洲乱码久久| 国产女优一区| 欧美超级免费视 在线| 欧美成人首页| 亚洲免费一区二区| 欧美一区亚洲一区| 亚洲精品少妇网址| 9久草视频在线视频精品| 国产精品美女久久福利网站| 老妇喷水一区二区三区| 欧美日韩高清不卡| 久久精品视频亚洲| 欧美激情综合网| 久久se精品一区二区| 老司机成人网| 亚洲欧美精品一区| 久久综合伊人77777| 亚洲视频在线观看免费| 欧美亚洲自偷自偷| 99精品99久久久久久宅男| 亚洲欧美日韩国产中文| 亚洲精品美女91| 欧美专区亚洲专区| 99精品视频免费| 欧美在线日韩| 亚洲一区二区三区免费观看 | 久久综合色天天久久综合图片| 一区二区三区日韩精品| 久久精品五月婷婷| 亚洲欧美在线免费观看| 欧美电影免费观看高清| 在线观看日产精品| 亚洲一区二区四区| 91久久精品日日躁夜夜躁欧美| 亚洲欧美国产精品桃花| 日韩一级免费观看| 久久久久久久久久码影片| 午夜精品一区二区三区在线播放 | 国产精品综合色区在线观看| 亚洲丰满少妇videoshd| 国产一区二区成人久久免费影院| 亚洲精选视频在线| 亚洲国产精品悠悠久久琪琪| 性做久久久久久| 亚洲一级影院| 欧美伦理在线观看| 欧美激情一区二区三区全黄| 伊人久久亚洲热| 久久精品国产2020观看福利| 久久国产日韩| 国产女主播一区| 亚洲欧美一级二级三级| 香蕉av777xxx色综合一区| 国产精品久久综合| 亚洲视频一区二区在线观看| 一区二区三区产品免费精品久久75| 欧美成人在线网站| 最新精品在线| 日韩视频不卡中文| 欧美精品电影| 亚洲另类春色国产| 亚洲视频在线播放| 国产精品久久久免费| 亚洲视频在线一区观看| 亚洲免费视频一区二区| 国产精品欧美久久| 亚洲中字黄色| 久久高清福利视频| 亚洲第一精品福利| 欧美成人a视频| 在线亚洲伦理| 久久国产一区| 在线看欧美视频| 欧美国产日韩二区| 一本久道久久综合中文字幕| 亚洲欧美电影在线观看| 国产欧美欧美| 久久先锋影音| 日韩一级黄色av| 性欧美暴力猛交69hd| 一区二区三区我不卡| 欧美电影免费观看高清| 99在线热播精品免费99热| 欧美一区国产二区| 亚洲激情欧美| 国产精品久久久久久久久| 欧美专区一区二区三区| 亚洲国产综合在线看不卡| 亚洲欧美综合另类中字| 影音先锋久久资源网| 欧美精品综合| 欧美一区二区三区在| 亚洲大片在线| 欧美亚洲在线观看| 亚洲精品一二三区| 国产欧美视频一区二区| 男女精品网站| 亚洲欧美日韩精品久久| 久久亚洲欧美国产精品乐播| 久久久久久一区| 亚洲国产一区二区三区a毛片 | 欧美jizzhd精品欧美喷水 | 欧美激情国产日韩| 午夜精品久久久久久久99樱桃 | 国产精品美女主播在线观看纯欲| 欧美在线不卡视频| 亚洲欧洲一区二区三区| 久久成年人视频| 一区二区免费在线观看| 精品成人在线视频| 国产精品羞羞答答xxdd| 欧美黄在线观看| 久久精品欧美| 亚洲主播在线观看| 亚洲日本无吗高清不卡| 欧美18av| 久久爱www.| 亚洲欧美三级在线| 一本色道久久88综合日韩精品| 国语精品一区| 国产欧美一区二区三区视频| 国产精品成人免费视频| 欧美日韩国产成人在线免费 | 欧美一级久久久| 在线视频精品一区| 亚洲精品影视在线观看| 欧美国产第一页| 欧美成人精品|