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

alex

alex

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  7 隨筆 :: 6 文章 :: 7 評(píng)論 :: 0 Trackbacks

abstract factory.感覺是個(gè)很玄的名字,即使在我寫學(xué)習(xí)筆記的時(shí)候,我也因?yàn)槿鄙佻F(xiàn)實(shí)中的實(shí)踐而對(duì)其了解不深。^^希望.... 多指正
Name:
?? abstract factory
Addressed Problem:
?? 提供對(duì)同1種相關(guān)對(duì)象的創(chuàng)建。比如在程序里面,希望根據(jù)用戶配置來(lái)設(shè)置UI方案,比如方案1和2,對(duì)應(yīng)的UI也存在2套不同的實(shí)現(xiàn)類,比如對(duì)于ScrollBar,有CScrollBar1和CScrollBar2,都繼承自ScrollBar。也許在程序里面有很多這樣的類。這樣你在應(yīng)用UI實(shí)例化類時(shí)就必須要選擇比如
IScrollBar* pScrollBar = NULL;
if (_use_ui_1)
?? pScrollBar = new CScrollBar1;
else
?? pScrollBar = new CScrollBar2;
也許你這樣感覺沒多大關(guān)系,但想象下,在程序的多處都存在這樣的選擇,為什么我不選擇一種less error phone的方法呢?比如
pScrollBar = Create(...);
這樣一種簡(jiǎn)單的方式呢?而且上面的寫法也引進(jìn)了1個(gè)避短,也就是在產(chǎn)生pScrollBar時(shí),涉及到了具體的實(shí)現(xiàn)類,這在面向?qū)ο筮@種program to interface這樣的語(yǔ)言中是很忌諱的事情。比如,在加種UI方案,也許你會(huì)再寫個(gè)else,這樣等于自己把自己往火堆里面推。你是一個(gè)勤奮的程序員,但不是個(gè)優(yōu)秀的程序員^^.也許有人會(huì)說(shuō),我可以利用prototype這樣的方式來(lái)啊。這樣,在程序的外面配置一下每個(gè)類的prototype就可以了,或許也可以用object factory啊,都可以(^^似乎是哦,我也沒學(xué)過(guò)這2個(gè)的說(shuō))解決上面的問(wèn)題,一個(gè)通過(guò)DoClone類似的,1個(gè)通過(guò)ID或其他的,其實(shí)在應(yīng)用上面的2種時(shí),自然的導(dǎo)出了abstract factory.為什么呢,因?yàn)樯厦娴?種,你都需要設(shè)置多個(gè)的原型或ID。比如也許在CUIManager的構(gòu)造里面寫賊大的if
if (_use_ui_1)
{
??? ...//設(shè)置UI_1下所有的prototype
}
else
{
??? ...//設(shè)置UI_2下所有的prototype
}
也許在將來(lái)的莫天,在加上UI_3,則。再寫個(gè)if.也許大家可能會(huì)想,我在應(yīng)用ui時(shí),我就知道了所要?jiǎng)?chuàng)建的對(duì)象,為什么我不把上面寶裝一下改成:
if (_use_ui_1)
?//設(shè)置factory_1
else
?//設(shè)置factory_2
然后在抽象出來(lái)的IFactory里面提供創(chuàng)建這些UI Class的方法,比如,CreateScrollBase.等等,這樣就有了abstract factory 的雛形。
基礎(chǔ)實(shí)現(xiàn)
/*
?測(cè)試abstract factory模式
*/

class?IScrollWindow
{
public:
?virtual void?DrawScroll(void) = 0;
};

class?IListWindow
{
public:
?virtual?void?DrawList(void) = 0;
};

class?ICreateWindowFactory
{
public:
?virtual?IScrollWindow*?CreateScrollWindow(void) = 0;

?virtual?IListWindow*?CreateListWindow(void) = 0;
};

class?CBlueWindowFactory:
?public?ICreateWindowFactory
{
?class?CBlueScrollWindow:
??public?IScrollWindow
?{
?public:
??virtual void?DrawScroll(void)
??{
???std::cout << "draw blue scroll" << std::endl;
??}
?};

?class?CBlueListWindow:
??public?IListWindow
?{
?public:
??virtual?void?DrawList(void)
??{
???std::cout << "draw blue list" << std::endl;
??}
?};
public:
?virtual?IScrollWindow*?CreateScrollWindow(void)
?{
??return?new CBlueScrollWindow;
?}

?virtual?IListWindow*?CreateListWindow(void)
?{
??return?new CBlueListWindow;
?}
};

class?CRedWindowFactory:
?public?ICreateWindowFactory
{
?class?CRedScrollWindow:
??public?IScrollWindow
?{
?public:
??virtual void?DrawScroll(void)
??{
???std::cout << "draw red scroll" << std::endl;
??}
?};

?class?CRedListWindow:
??public?IListWindow
?{
?public:
??virtual?void?DrawList(void)
??{
???std::cout << "draw red list" << std::endl;
??}
?};
public:
?virtual?IScrollWindow*?CreateScrollWindow(void)
?{
??return?new CRedScrollWindow;
?}

?virtual?IListWindow*?CreateListWindow(void)
?{
??return?new CRedListWindow;
?}
};
在需要用的地方,就可以這樣:
ICreateWindowFactory*?pCreateWindow1?= new CBlueWindowFactory;

?pCreateWindow1->CreateListWindow()->DrawList();
?pCreateWindow1->CreateScrollWindow()->DrawScroll();
假如需要用不同的工廠,則更換不會(huì)影響到調(diào)用處的代碼。因?yàn)榈粲霉S的地方是面向接口的。其實(shí)abstract factory的理念應(yīng)該是比較簡(jiǎn)單的(^^瞎猜的).基本講完了什么是抽象類工廠,他要解決的一些問(wèn)題以及怎么解決和1個(gè)小而亂的demo代碼段。下面來(lái)看下我們?cè)趺捶夯@個(gè)類工廠,這個(gè)會(huì)涉及到loki里面的具體實(shí)現(xiàn),大家要加滿油啊,因?yàn)榉夯惞S是一件不容易的事情啊。

泛化_1
首先,(^^這部分我也不是很懂)要泛化的是abstract factory的接口,就象上面的CreateScrollWindow和CreateListWindow,在泛化時(shí)需要的信息是要?jiǎng)?chuàng)建的同1組對(duì)象的相關(guān)接口比如IScrollBar,IList等等,在loki里面,要為1個(gè)類泛化1組接口,可以通過(guò)GenScatterHierarchy來(lái)將unit應(yīng)用到typelist里的每1個(gè)類型,并將該類從unit<type>派生,從而得到1組接口。GenScatterHierarchy做了什么呢,他產(chǎn)生了啥呢?具體的可以看morden c++里面的實(shí)現(xiàn)。通過(guò)GenScatterHierarchy我們得到了我們要得1組接口。下面是loki里面對(duì)這個(gè)得相關(guān)實(shí)現(xiàn)
template <class T>
class AbstractFactoryUnit
{
public:
????virtual T* DoCreate(Type2Type<T>) = 0;
????virtual ~AbstractFactoryUnit() {}
};

可以看到,上面定義了2個(gè)函數(shù),而這個(gè)類就是我上面說(shuō)得調(diào)用GenScatterHierarchy時(shí),具現(xiàn)化時(shí)對(duì)typelist得每個(gè)類型應(yīng)用得template類,而最后產(chǎn)生得也將是類似AbstractFactoryUnit<IScrollBar>的類,我們具體的抽象工廠從這些派生。至于pure dctor這個(gè)大家應(yīng)該都知道啥作用。下面來(lái)看Abstract Factory 的泛化:

template
<
????class TList,
????template <class> class Unit = AbstractFactoryUnit
>
class AbstractFactory : public GenScatterHierarchy<TList, Unit>
{
public:
?????typedef TList ProductList;
???????
?????template <class T> T* Create()
?????{
????????Unit<T>& unit = *this;
????????return unit.DoCreate(Type2Type<T>());
?????}
?};
可以看到這個(gè)即由GenScatterHierarchy來(lái)得到了我們想要的東西。提供了Create的模板函數(shù),使得我們可以象這樣factory.Create<IScrollBar>()的方便形勢(shì)來(lái)調(diào)用。ProductList是對(duì)于抽象工廠要?jiǎng)?chuàng)建的類型的重命名。方便后面在產(chǎn)生實(shí)際的類型時(shí),獲取對(duì)應(yīng)的類型信息,對(duì)于DoCreate的參數(shù),大家應(yīng)該都明白這是重載用的,那用在哪里呢?下面會(huì)介紹。

泛化_2
在辛苦介紹完泛化抽象工廠的接口后,我們可以通過(guò)類似的方式來(lái)定義1個(gè)abstract factory的接口
Loki::AbstractFactory<LOKI_TYPELIST_2(IScrollBar,IListWindow)>
下面我們來(lái)介紹最后的,我們?cè)趺磥?lái)提供抽象工廠的實(shí)現(xiàn),首先是對(duì)象的創(chuàng)建,loki里面提供了默認(rèn)的創(chuàng)建的方法,當(dāng)然我們可以修改或用特化的版本來(lái)做選擇。
template <class ConcreteProduct, class Base>
class OpNewFactoryUnit : public Base
{
???? typedef typename Base::ProductList BaseProductList;
???
protected:
?????typedef typename BaseProductList::Tail ProductList;
???
public:
?????typedef typename BaseProductList::Head AbstractProduct;
?????ConcreteProduct* DoCreate(Type2Type<AbstractProduct>)
?????{
????????? return new ConcreteProduct;
?????}
};
可以看到DoCreate是我們的核心部分,里面調(diào)用了new來(lái)創(chuàng)建對(duì)象。而這里也讓我們看到這應(yīng)該是上面創(chuàng)建對(duì)象的重載。而Type2Type的作用正是在這里體現(xiàn)作用,因?yàn)閏++無(wú)法通過(guò)函數(shù)返回值來(lái)重載不同的對(duì)象。也許你會(huì)看到上面的一些類型定義,包括OpNewFactoryUnit的2個(gè)模板參數(shù),第2個(gè)模板參數(shù)是實(shí)現(xiàn)GenLinearHierarchy必備的GenLinearHierarchy和上面的GenScatterHierarchy的核心思想一樣,都是通過(guò)具現(xiàn)化來(lái)實(shí)現(xiàn)的,不過(guò)GenLinearHierarchy產(chǎn)生的是線性的繼承體系,中間夾雜著比如OpNewFactoryUnit<IScrollBar,GenLinearHierarchy<...> >這樣的形勢(shì)。下面來(lái)看下抽象工程的具體實(shí)現(xiàn)的泛化,聯(lián)系起來(lái)就能對(duì)上面的理解了
template
<
????class AbstractFact,
????template <class, class> class Creator = OpNewFactoryUnit,
????class TList = typename AbstractFact::ProductList
>
class ConcreteFactory
?????: public GenLinearHierarchy<
?????typename TL::Reverse<TList>::Result, Creator, AbstractFact>
{
public:
????typedef typename AbstractFact::ProductList ProductList;
????typedef TList ConcreteProductList;
};
可以看到ConcreteFactory由GenLinearHierarchy來(lái)驅(qū)動(dòng)產(chǎn)生我們想要的,本來(lái)這個(gè)貼圖比較明朗點(diǎn),但我懶的畫,哈哈。從GenLinearHierarchy的參數(shù)來(lái)看,第1個(gè)是具體的實(shí)現(xiàn)類的typelist,比如LOKI_TYPELIST2(CScrollBar_1,CListWindow_1),至于為什么要對(duì)類型做reverse操作,因?yàn)樵陬惖幕A(chǔ)體系產(chǎn)生后,typelist的第1個(gè)元素,在繼承體系是由下往上的,而于上面由OpNewFactoryUnit等定義的ProductList的Head定義的自上往下的是相反的,所以這里應(yīng)用了reverse操作。Creator就是上面的OpNewFactoryUnit或你自定義的元素。并在具現(xiàn)化是,應(yīng)用typelist的每個(gè)類型。AbstractFact是繼承體現(xiàn)的最頂端,這個(gè)應(yīng)該很明顯,就是上面定義的AbstractFactory,這樣啥都明確了,具體的接口,對(duì)接口的函數(shù)的重載都已經(jīng)泛化完成。下面是(^^睡死了,睡覺去了,簡(jiǎn)單從便,上面均未調(diào)試哦).至于為什么會(huì)把第3個(gè)參數(shù)默認(rèn)為抽象類工廠接口的ProductList,這個(gè)和loki用基于prototype的Creator有關(guān)系。。(^^俺是菜鳥,就只能到這里了)
對(duì)abstract factory的看法,優(yōu)點(diǎn)在上面的已經(jīng)說(shuō)過(guò)了,確定在,我們要添加1種對(duì)象的創(chuàng)建時(shí),都要去修改接口的定義,當(dāng)然后面的泛化也為我們解決了些問(wèn)題,但泛化對(duì)于參數(shù)的傳遞不怎么好用,可以通過(guò)提供新的OpNewFactoryUnit來(lái)適當(dāng)解決。
??????????????????????????????????????????????????? agerlis.2007.2.10 0:22
posted on 2007-02-11 15:39 agerlis 閱讀(190) 評(píng)論(0)  編輯 收藏 引用

只有注冊(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>
            欧美成人午夜激情| 噜噜噜在线观看免费视频日韩| 欧美日韩免费高清一区色橹橹| 久久免费视频网| 久久一本综合频道| 久久综合伊人77777蜜臀| 老牛影视一区二区三区| 美脚丝袜一区二区三区在线观看| 老司机免费视频一区二区三区 | 夜夜嗨网站十八久久| 99精品视频一区| 国产情人综合久久777777| 日韩午夜电影av| 一区二区三区久久网| 亚洲图片自拍偷拍| 久久国产直播| 欧美激情小视频| 国产精品久久看| 尤物九九久久国产精品的分类| 亚洲精品国产欧美| 午夜激情综合网| 免费成人黄色av| 夜夜嗨av色综合久久久综合网 | 一区二区三区免费看| 欧美一级视频一区二区| 欧美精品一区二区三区久久久竹菊| 欧美午夜女人视频在线| 亚洲高清av在线| 亚洲综合丁香| 亚洲国产日韩欧美| 最新国产精品拍自在线播放| 小黄鸭精品密入口导航| 欧美日韩国产成人在线观看| 国内精品福利| 亚洲一区二区在线观看视频| 免费欧美日韩国产三级电影| 一区二区三区四区五区在线| 免费中文日韩| 一区精品在线| 欧美亚洲日本国产| 日韩亚洲欧美中文三级| 免费在线观看日韩欧美| 一区国产精品| 另类激情亚洲| 久久国产乱子精品免费女| 国产精品视频自拍| 亚洲小少妇裸体bbw| 最新国产の精品合集bt伙计| 久久久免费av| 在线看无码的免费网站| 久久精品视频一| 亚洲欧美日本国产有色| 欧美视频一区二区在线观看 | 欧美精品v日韩精品v国产精品 | 欧美在线一级va免费观看| 国产精品国产三级国产普通话三级 | 久久综合久久综合九色| 中日韩美女免费视频网址在线观看 | 久久久精品2019中文字幕神马| 亚洲第一毛片| 久久久久国产精品人| 国产区欧美区日韩区| 亚洲午夜免费福利视频| 亚洲欧洲精品一区二区精品久久久| 久久久久国产精品www | 中文在线资源观看网站视频免费不卡 | 欧美极品欧美精品欧美视频| 亚洲欧洲综合另类在线| 亚洲人体1000| 欧美亚州一区二区三区| 亚洲欧美日韩久久精品| 亚洲欧美精品在线观看| 国产嫩草影院久久久久| 久久久久久久久久码影片| 久久精品视频网| 最新国产の精品合集bt伙计| 亚洲精品一区二区三区在线观看| 欧美日韩高清在线观看| 香蕉免费一区二区三区在线观看 | 欧美成人dvd在线视频| 欧美高清在线观看| 亚洲神马久久| 欧美在线观看一区二区| 亚洲高清视频的网址| 亚洲激情黄色| 国产精品亚洲综合久久| 久久久综合网站| 欧美国产日韩在线观看| 亚洲永久在线| 久久久久一区二区三区| 一区二区三区四区五区精品视频 | 午夜精品久久久久久久99热浪潮| 亚洲综合色自拍一区| 亚洲二区免费| 一区二区三区精品久久久| 韩日视频一区| 日韩小视频在线观看专区| 国产日韩成人精品| 欧美激情一区二区| 国产日韩视频| 亚洲蜜桃精久久久久久久| 国产专区一区| 99精品欧美一区二区三区综合在线| 国产一区二区三区免费观看 | 欧美与黑人午夜性猛交久久久| 久久精品一区二区国产| 美女久久一区| 久久国产精品久久w女人spa| 欧美电影在线观看完整版| 亚洲一区二区免费看| 久久综合色综合88| 欧美中文字幕| 国产精品jvid在线观看蜜臀| 欧美成va人片在线观看| 国产精品一二三四区| 日韩天堂在线视频| 亚洲黄色在线视频| 久久精品人人做人人爽电影蜜月| 亚洲午夜性刺激影院| 欧美国产精品一区| 六十路精品视频| 国产午夜亚洲精品理论片色戒| 亚洲美女91| 日韩亚洲国产欧美| 老司机精品福利视频| 美女爽到呻吟久久久久| 国产三区精品| 亚洲自拍偷拍色片视频| 亚洲自啪免费| 欧美日韩精品在线观看| 亚洲日本电影| 亚洲蜜桃精久久久久久久| 久久五月婷婷丁香社区| 久久亚洲国产成人| 狠狠干综合网| 久久久综合激的五月天| 欧美不卡一卡二卡免费版| 伊人成人在线视频| 久久人体大胆视频| 欧美大片免费观看| 99riav1国产精品视频| 亚洲美女尤物影院| 欧美视频免费| 亚洲一区观看| 欧美在线视频一区二区| 国产欧美日韩在线播放| 香蕉久久精品日日躁夜夜躁| 久久精品国产一区二区电影 | 欧美激情精品久久久久久免费印度 | 美国成人直播| 亚洲国产精选| 欧美精品v日韩精品v国产精品 | 国一区二区在线观看| 在线视频精品一| 欧美在线|欧美| 一区二区三区在线观看国产| 久久久高清一区二区三区| 久久综合中文色婷婷| 在线播放中文字幕一区| 欧美激情久久久久| 日韩视频一区二区三区在线播放免费观看| 亚洲精品欧洲| 国产精品久久久久久久久久妞妞 | 国产一区二区剧情av在线| 久久99在线观看| 亚洲第一区在线观看| 99国产精品99久久久久久粉嫩| 欧美日韩福利在线观看| 亚洲欧美一区二区视频| 欧美成人激情视频| 亚洲视频电影图片偷拍一区| 国产精品日日摸夜夜添夜夜av| 欧美一区二区三区的| 亚洲黄色成人| 久久精品30| 日韩一级在线| 国产一在线精品一区在线观看| 免费视频一区二区三区在线观看| 亚洲欧洲另类国产综合| 欧美一区中文字幕| 亚洲乱码国产乱码精品精| 国产欧美高清| 欧美视频不卡中文| 久久久亚洲高清| 在线综合欧美| 欧美激情视频在线播放| 性做久久久久久免费观看欧美| 亚洲精品国产精品久久清纯直播 | 免费在线亚洲欧美| 亚洲欧美精品在线| 亚洲国产另类 国产精品国产免费| 欧美性片在线观看| 欧美激情一区二区久久久| 久久不射中文字幕| 亚洲在线播放| 一区二区三区福利| 91久久嫩草影院一区二区| 米奇777在线欧美播放| 香蕉国产精品偷在线观看不卡| 亚洲天堂成人|