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

0 引言

0.1 目的

       本文檔給出設(shè)計(jì)模式之——Factory模式的簡(jiǎn)化詮釋?zhuān)⒔o出其C++實(shí)現(xiàn)。

0.2 說(shuō)明

Project

Design Pattern Explanation(By K_Eckel)

Authorization

Free Distributed but Ownership Reserved

Date

Test Bed

MS Visual C++ 6.0

0.3 參考

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

u       書(shū)籍

[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.

u       網(wǎng)頁(yè)

0.4 聯(lián)系作者

Author

K_Eckel

State

Candidate for Master’s Degree School of

E_mail

frwei@whu.edu.cn  

 

2 Factory模式

2.1 問(wèn)題

       在面向?qū)ο笙到y(tǒng)設(shè)計(jì)中經(jīng)常可以遇到以下的兩類(lèi)問(wèn)題:

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

       2)還有一種情況就是在父類(lèi)中并不知道具體要實(shí)例化哪一個(gè)具體的子類(lèi)。這里的意思為:假設(shè)我們?cè)陬?lèi)A中要使用到類(lèi)B,B是一個(gè)抽象父類(lèi),在A中并不知道具體要實(shí)例化那一個(gè)B的子類(lèi),但是在類(lèi)A的子類(lèi)D中是可以知道的。在A中我們沒(méi)有辦法直接使用類(lèi)似于new ×××的語(yǔ)句,因?yàn)楦揪筒恢?#215;××是什么。

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

       1)定義創(chuàng)建對(duì)象的接口,封裝了對(duì)象的創(chuàng)建;

       2)使得具體化類(lèi)的工作延遲到了子類(lèi)中。

2.2 模式選擇

       我們通常使用Factory模式來(lái)解決上面給出的兩個(gè)問(wèn)題。在第一個(gè)問(wèn)題中,我們經(jīng)常就是聲明一個(gè)創(chuàng)建對(duì)象的接口,并封裝了對(duì)象的創(chuàng)建過(guò)程。Factory這里類(lèi)似于一個(gè)真正意義上的工廠(生產(chǎn)對(duì)象)。在第二個(gè)問(wèn)題中,我們需要提供一個(gè)對(duì)象創(chuàng)建對(duì)象的接口,并在子類(lèi)中提供其具體實(shí)現(xiàn)(因?yàn)橹挥性谧宇?lèi)中可以決定到底實(shí)例化哪一個(gè)類(lèi))。第一中情況的Factory的結(jié)構(gòu)示意圖為:


1Factory模式結(jié)構(gòu)示意圖1

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


2Factory模式結(jié)構(gòu)示意圖1

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

2.3 實(shí)現(xiàn)

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

#ifndef _PRODUCT_H_
#define _PRODUCT_H_

class Product
{
public:
virtual ~Product() =0;

protected:
Product();

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;
}


2.4 討論

     Factory 模式在實(shí)際開(kāi)發(fā)中應(yīng)用非常廣泛,面向?qū)ο蟮南到y(tǒng)經(jīng)常面臨著對(duì)象創(chuàng)建問(wèn)題:要?jiǎng)?chuàng)建的類(lèi)實(shí)在是太多了。而Factory提供的創(chuàng)建對(duì)象的接口封裝(第一個(gè)功 能),以及其將類(lèi)的實(shí)例化推遲到子類(lèi)(第二個(gè)功能)都部分地解決了實(shí)際問(wèn)題。一個(gè)簡(jiǎn)單的例子就是筆者開(kāi)開(kāi)發(fā)Visual CMCS系統(tǒng)的語(yǔ)義分析過(guò)程中,由于要為文法中的每個(gè)非終結(jié)符構(gòu)造一個(gè)類(lèi)處理,因此這個(gè)過(guò)程中對(duì)象的創(chuàng)建非常多,采用Factory模式后系統(tǒng)可讀性性和 維護(hù)都變得elegant許多。
     Factory模式也帶來(lái)至少以下兩個(gè)問(wèn)題:
     1)如果為每一個(gè)具體的ConcreteProduct類(lèi)的實(shí)例化提供一個(gè)函數(shù)體,那么我們可能不得不在系統(tǒng)中添加了一個(gè)方法來(lái)處理這個(gè)新建的 ConcreteProduct,這樣Factory的接口永遠(yuǎn)就不肯能封閉(Close)。當(dāng)然我們可以通過(guò)創(chuàng)建一個(gè)Factory的子類(lèi)來(lái)通過(guò)多態(tài)實(shí) 現(xiàn)這一點(diǎn),但是這也是以新建一個(gè)類(lèi)作為代價(jià)的。
     2)在實(shí)現(xiàn)中我們可以通過(guò)參數(shù)化工廠方法,即給FactoryMethod()傳遞一個(gè)參數(shù)用以決定是創(chuàng)建具體哪一個(gè)具體的Product(實(shí)際上筆者在 Visual CMCS中也正是這樣做的)。當(dāng)然也可以通過(guò)模板化避免1)中的子類(lèi)創(chuàng)建子類(lèi),其方法就是將具體Product類(lèi)作為模板參數(shù),實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單。
     可以看出,F(xiàn)actory模式對(duì)于對(duì)象的創(chuàng)建給予開(kāi)發(fā)人員提供了很好的實(shí)現(xiàn)策略,但是Factory模式僅僅局限于一類(lèi)類(lèi)(就是說(shuō)Product是一類(lèi), 有一個(gè)共同的基類(lèi)),如果我們要為不同類(lèi)的類(lèi)提供一個(gè)對(duì)象創(chuàng)建的接口,那就要用Abstract Factory了。



只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美91大片| 欧美国产日本| 久久伊人亚洲| 亚洲免费观看高清在线观看| 9色porny自拍视频一区二区| 国产精品久久久久一区二区| 欧美一区三区二区在线观看| 久久精品亚洲一区二区三区浴池| 最近中文字幕mv在线一区二区三区四区| 91久久中文字幕| 欧美视频中文一区二区三区在线观看 | 亚洲国产欧美一区| 亚洲麻豆视频| 国产一区二区三区在线观看网站 | 久久99在线观看| 久久视频在线看| 宅男噜噜噜66一区二区| 午夜精品区一区二区三| 亚洲国产日日夜夜| 中文国产一区| 亚洲二区视频| 亚洲天堂av电影| 亚洲国产1区| 亚洲午夜在线观看| 亚洲福利在线视频| 亚洲夜间福利| 亚洲国产视频a| 亚洲一区二区在线视频| 亚洲国产一区二区三区高清| 亚洲午夜91| 亚洲国产婷婷香蕉久久久久久99 | 一本到高清视频免费精品| 国内精品久久久| 亚洲美女中文字幕| 一区在线电影| 99精品热6080yy久久| 影音先锋另类| 亚洲已满18点击进入久久| 亚洲欧洲精品一区二区精品久久久| 亚洲一区国产一区| 亚洲精品你懂的| 欧美一区在线直播| 亚洲视频视频在线| 另类酷文…触手系列精品集v1小说| 亚洲免费影视| 欧美风情在线观看| 麻豆久久精品| 国产精品视频| 亚洲肉体裸体xxxx137| 激情综合网址| 亚洲一区二区三区精品在线观看| 亚洲人在线视频| 久久精品国产v日韩v亚洲| 亚洲男人av电影| 欧美精品激情在线观看| 免费在线观看精品| 国产拍揄自揄精品视频麻豆| 9人人澡人人爽人人精品| 亚洲国产另类 国产精品国产免费| 亚洲欧美日韩第一区| 一本色道久久综合一区| 久热精品视频| 久久视频一区二区| 国产酒店精品激情| 一本色道综合亚洲| 夜色激情一区二区| 免费观看一级特黄欧美大片| 久久天天躁狠狠躁夜夜av| 国产精品一区二区在线观看不卡 | 男女精品视频| 国产一级一区二区| 亚洲在线视频网站| 亚洲在线电影| 欧美日韩一区二区视频在线| 亚洲国产精品国自产拍av秋霞| 韩日欧美一区| 欧美一区亚洲| 久久精品二区亚洲w码| 国产精品免费一区豆花| 一本久久综合| 一区二区激情小说| 欧美乱在线观看| 亚洲片国产一区一级在线观看| 91久久久在线| 媚黑女一区二区| 欧美成人蜜桃| 亚洲福利视频专区| 老司机成人网| 欧美成人自拍| 亚洲黄色免费| 欧美成年人网站| 亚洲福利视频二区| 亚洲久久视频| 欧美精品一区二区三区久久久竹菊| 亚洲国产岛国毛片在线| 最新中文字幕亚洲| 欧美大片在线观看| 亚洲精品精选| 在线视频一区二区| 欧美色欧美亚洲另类七区| 99精品国产热久久91蜜凸| 亚洲一区二区精品在线观看| 国产精品av久久久久久麻豆网| 一本一本久久| 欧美一二三区在线观看| 国产日韩一级二级三级| 久久成人免费视频| 欧美.com| 99精品视频免费观看视频| 欧美日韩国产片| 中文在线资源观看网站视频免费不卡 | 香蕉久久一区二区不卡无毒影院 | 国产一区二区三区日韩欧美| 欧美在线视频日韩| 蜜桃精品一区二区三区 | 欧美ed2k| 99精品视频一区二区三区| 亚洲欧美日韩精品| 国产欧美二区| 久久精品水蜜桃av综合天堂| 欧美刺激性大交免费视频| 亚洲精选中文字幕| 欧美性猛交视频| 欧美一区二区三区免费观看视频| 乱中年女人伦av一区二区| 亚洲人体偷拍| 国产精品美女久久久久久久| 久久黄色小说| 亚洲国产高清aⅴ视频| 亚洲午夜一二三区视频| 国产欧美综合在线| 狂野欧美激情性xxxx欧美| 亚洲巨乳在线| 欧美中文字幕第一页| 在线观看中文字幕亚洲| 欧美精品一级| 亚洲男人第一av网站| 麻豆av福利av久久av| 亚洲伦伦在线| 国产欧美日韩精品一区| 美女黄色成人网| 夜夜嗨av一区二区三区网站四季av| 欧美在线视频一区二区| 亚洲国产精品va在线看黑人| 欧美午夜激情小视频| 久久国内精品视频| 亚洲精品一区二区三区av| 久久精品视频一| 亚洲精品日韩激情在线电影| 国产精品推荐精品| 久久久久九九视频| 99热免费精品在线观看| 久久久久久穴| 中文欧美在线视频| 狠狠色丁香婷婷综合久久片| 欧美美女喷水视频| 欧美中文字幕不卡| 日韩亚洲欧美成人| 久久久综合香蕉尹人综合网| 99re6这里只有精品视频在线观看| 国产伦精品一区二区三区免费| 免费欧美高清视频| 午夜精品久久久久久久男人的天堂| 亚洲黄色一区| 久久九九全国免费精品观看| 一本大道久久a久久精二百| 国产真实久久| 欧美日韩在线直播| 巨乳诱惑日韩免费av| 亚洲免费在线观看视频| 亚洲人永久免费| 久久综合九九| 先锋a资源在线看亚洲| 亚洲精品免费看| 国内精品美女在线观看| 欧美午夜精品久久久久久人妖| 久久亚洲美女| 亚洲免费视频一区二区| 亚洲人成77777在线观看网| 久久综合999| 亚洲欧洲av一区二区| 日韩视频久久| 亚洲第一精品久久忘忧草社区| 国产精品亚洲综合一区在线观看| 欧美精品1区| 久久精品免视看| 亚洲伊人第一页| 日韩写真在线| 亚洲电影有码| 美日韩在线观看| 久久激情五月婷婷| 亚洲男人第一网站| 9人人澡人人爽人人精品| 亚洲大胆在线| 国外成人在线视频| 国产农村妇女毛片精品久久莱园子| 欧美日韩在线一区| 欧美剧在线免费观看网站| 麻豆精品网站| 久久久免费观看视频|