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

alex

alex

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

abstract factory.感覺是個很玄的名字,即使在我寫學習筆記的時候,我也因為缺少現(xiàn)實中的實踐而對其了解不深。^^希望.... 多指正
Name:
?? abstract factory
Addressed Problem:
?? 提供對同1種相關對象的創(chuàng)建。比如在程序里面,希望根據(jù)用戶配置來設置UI方案,比如方案1和2,對應的UI也存在2套不同的實現(xiàn)類,比如對于ScrollBar,有CScrollBar1和CScrollBar2,都繼承自ScrollBar。也許在程序里面有很多這樣的類。這樣你在應用UI實例化類時就必須要選擇比如
IScrollBar* pScrollBar = NULL;
if (_use_ui_1)
?? pScrollBar = new CScrollBar1;
else
?? pScrollBar = new CScrollBar2;
也許你這樣感覺沒多大關系,但想象下,在程序的多處都存在這樣的選擇,為什么我不選擇一種less error phone的方法呢?比如
pScrollBar = Create(...);
這樣一種簡單的方式呢?而且上面的寫法也引進了1個避短,也就是在產生pScrollBar時,涉及到了具體的實現(xiàn)類,這在面向對象這種program to interface這樣的語言中是很忌諱的事情。比如,在加種UI方案,也許你會再寫個else,這樣等于自己把自己往火堆里面推。你是一個勤奮的程序員,但不是個優(yōu)秀的程序員^^.也許有人會說,我可以利用prototype這樣的方式來啊。這樣,在程序的外面配置一下每個類的prototype就可以了,或許也可以用object factory啊,都可以(^^似乎是哦,我也沒學過這2個的說)解決上面的問題,一個通過DoClone類似的,1個通過ID或其他的,其實在應用上面的2種時,自然的導出了abstract factory.為什么呢,因為上面的2種,你都需要設置多個的原型或ID。比如也許在CUIManager的構造里面寫賊大的if
if (_use_ui_1)
{
??? ...//設置UI_1下所有的prototype
}
else
{
??? ...//設置UI_2下所有的prototype
}
也許在將來的莫天,在加上UI_3,則。再寫個if.也許大家可能會想,我在應用ui時,我就知道了所要創(chuàng)建的對象,為什么我不把上面寶裝一下改成:
if (_use_ui_1)
?//設置factory_1
else
?//設置factory_2
然后在抽象出來的IFactory里面提供創(chuàng)建這些UI Class的方法,比如,CreateScrollBase.等等,這樣就有了abstract factory 的雛形。
基礎實現(xiàn)
/*
?測試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();
假如需要用不同的工廠,則更換不會影響到調用處的代碼。因為掉用工廠的地方是面向接口的。其實abstract factory的理念應該是比較簡單的(^^瞎猜的).基本講完了什么是抽象類工廠,他要解決的一些問題以及怎么解決和1個小而亂的demo代碼段。下面來看下我們怎么泛化這個類工廠,這個會涉及到loki里面的具體實現(xiàn),大家要加滿油啊,因為泛化類工廠是一件不容易的事情啊。

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

可以看到,上面定義了2個函數(shù),而這個類就是我上面說得調用GenScatterHierarchy時,具現(xiàn)化時對typelist得每個類型應用得template類,而最后產生得也將是類似AbstractFactoryUnit<IScrollBar>的類,我們具體的抽象工廠從這些派生。至于pure dctor這個大家應該都知道啥作用。下面來看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>());
?????}
?};
可以看到這個即由GenScatterHierarchy來得到了我們想要的東西。提供了Create的模板函數(shù),使得我們可以象這樣factory.Create<IScrollBar>()的方便形勢來調用。ProductList是對于抽象工廠要創(chuàng)建的類型的重命名。方便后面在產生實際的類型時,獲取對應的類型信息,對于DoCreate的參數(shù),大家應該都明白這是重載用的,那用在哪里呢?下面會介紹。

泛化_2
在辛苦介紹完泛化抽象工廠的接口后,我們可以通過類似的方式來定義1個abstract factory的接口
Loki::AbstractFactory<LOKI_TYPELIST_2(IScrollBar,IListWindow)>
下面我們來介紹最后的,我們怎么來提供抽象工廠的實現(xiàn),首先是對象的創(chuàng)建,loki里面提供了默認的創(chuàng)建的方法,當然我們可以修改或用特化的版本來做選擇。
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是我們的核心部分,里面調用了new來創(chuàng)建對象。而這里也讓我們看到這應該是上面創(chuàng)建對象的重載。而Type2Type的作用正是在這里體現(xiàn)作用,因為c++無法通過函數(shù)返回值來重載不同的對象。也許你會看到上面的一些類型定義,包括OpNewFactoryUnit的2個模板參數(shù),第2個模板參數(shù)是實現(xiàn)GenLinearHierarchy必備的GenLinearHierarchy和上面的GenScatterHierarchy的核心思想一樣,都是通過具現(xiàn)化來實現(xiàn)的,不過GenLinearHierarchy產生的是線性的繼承體系,中間夾雜著比如OpNewFactoryUnit<IScrollBar,GenLinearHierarchy<...> >這樣的形勢。下面來看下抽象工程的具體實現(xiàn)的泛化,聯(lián)系起來就能對上面的理解了
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來驅動產生我們想要的,本來這個貼圖比較明朗點,但我懶的畫,哈哈。從GenLinearHierarchy的參數(shù)來看,第1個是具體的實現(xiàn)類的typelist,比如LOKI_TYPELIST2(CScrollBar_1,CListWindow_1),至于為什么要對類型做reverse操作,因為在類的基礎體系產生后,typelist的第1個元素,在繼承體系是由下往上的,而于上面由OpNewFactoryUnit等定義的ProductList的Head定義的自上往下的是相反的,所以這里應用了reverse操作。Creator就是上面的OpNewFactoryUnit或你自定義的元素。并在具現(xiàn)化是,應用typelist的每個類型。AbstractFact是繼承體現(xiàn)的最頂端,這個應該很明顯,就是上面定義的AbstractFactory,這樣啥都明確了,具體的接口,對接口的函數(shù)的重載都已經泛化完成。下面是(^^睡死了,睡覺去了,簡單從便,上面均未調試哦).至于為什么會把第3個參數(shù)默認為抽象類工廠接口的ProductList,這個和loki用基于prototype的Creator有關系。。(^^俺是菜鳥,就只能到這里了)
對abstract factory的看法,優(yōu)點在上面的已經說過了,確定在,我們要添加1種對象的創(chuàng)建時,都要去修改接口的定義,當然后面的泛化也為我們解決了些問題,但泛化對于參數(shù)的傳遞不怎么好用,可以通過提供新的OpNewFactoryUnit來適當解決。
??????????????????????????????????????????????????? agerlis.2007.2.10 0:22
posted on 2007-02-11 15:53 agerlis 閱讀(400) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   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>
            性做久久久久久久久| 欧美电影电视剧在线观看| 午夜精品一区二区三区在线播放| 欧美成年人在线观看| 精品成人在线| 久久婷婷国产综合尤物精品| 亚洲一区二区三区欧美| 国产精品成人aaaaa网站| 亚洲精品视频在线看| 美女999久久久精品视频| 久久精品99国产精品酒店日本| 国产九九精品视频| 欧美亚洲免费电影| 亚洲欧美电影院| 国产真实乱偷精品视频免| 欧美一级片一区| 亚洲国产高清视频| 亚洲精品护士| 亚洲丰满在线| 久久女同精品一区二区| 午夜天堂精品久久久久| 国产精品国产三级国产普通话三级| 亚洲色图自拍| 亚洲一区亚洲| 精品不卡视频| 欧美黄色精品| 欧美精品免费播放| 久久人人看视频| 亚洲综合欧美日韩| 国产欧美一区二区三区在线老狼| 久久gogo国模啪啪人体图| 久久国产精品一区二区三区| 亚洲人午夜精品免费| 正在播放亚洲一区| 国产亚洲一区在线| 欧美成人亚洲成人日韩成人| 蜜臀va亚洲va欧美va天堂| 亚洲人成人77777线观看| 一区二区三区黄色| 国产日韩精品视频一区| 欧美国产日韩在线| 欧美色道久久88综合亚洲精品| 久久高清国产| 美女黄毛**国产精品啪啪| 亚洲免费视频成人| 久久视频免费观看| 亚洲私人影院在线观看| 久久精彩免费视频| 妖精视频成人观看www| 亚洲少妇诱惑| 亚洲高清视频一区二区| 日韩亚洲欧美在线观看| 国产又爽又黄的激情精品视频 | 牛牛影视久久网| 欧美午夜不卡在线观看免费| 久久久免费av| 欧美三级视频在线观看| 美玉足脚交一区二区三区图片| 欧美人成在线视频| 久久亚洲精品网站| 国产精品久久久久久福利一牛影视| 免费看精品久久片| 国产欧美一区二区精品仙草咪 | 久久国产精品一区二区| 欧美精品 日韩| 久久久久国产一区二区三区| 欧美日韩专区在线| 欧美华人在线视频| 极品中文字幕一区| 午夜精品久久久久久久白皮肤 | 玖玖综合伊人| 国产日韩欧美自拍| 亚洲视频免费在线观看| 日韩视频一区二区三区在线播放免费观看 | 亚洲一区成人| 免费观看在线综合| 久久久久一区二区三区| 国产精品一区二区在线| 一区二区三区国产| 亚洲深爱激情| 欧美视频国产精品| 亚洲美女精品一区| 99在线视频精品| 欧美激情a∨在线视频播放| 老牛国产精品一区的观看方式| 国产日韩在线播放| 午夜在线精品偷拍| 久久国产99| 影音欧美亚洲| 久久久久久久91| 欧美成人中文字幕| 亚洲激情在线观看视频免费| 男人的天堂成人在线| 亚洲黄色影院| 99精品免费视频| 欧美调教vk| 先锋影音一区二区三区| 久久久亚洲影院你懂的| 在线精品亚洲| 欧美大片一区二区| 亚洲精品在线三区| 亚洲综合色视频| 国产一区二区三区观看| 久久中文字幕一区二区三区| 欧美国产激情| 99精品视频免费在线观看| 亚洲第一级黄色片| 亚洲免费电影在线| 国产精品久久久久久久久久妞妞| 亚洲欧美日韩国产中文| 免费成人av在线看| 亚洲免费成人av电影| 欧美日韩欧美一区二区| 亚洲欧美区自拍先锋| 美女在线一区二区| 亚洲伦理自拍| 国产精品久久久亚洲一区| 欧美影片第一页| 亚洲国产二区| 亚洲一区高清| 国产亚洲欧美激情| 欧美大片一区二区三区| 亚洲欧美精品| 欧美黄色片免费观看| 亚洲一区二区三区中文字幕| 伊人一区二区三区久久精品| 欧美精品在线观看一区二区| 亚洲自拍高清| 亚洲高清免费| 久久精品国产久精国产思思| 亚洲精品永久免费精品| 国产欧美日韩中文字幕在线| 欧美电影免费观看高清完整版 | 黄色日韩网站| 欧美日韩国产综合久久| 欧美与欧洲交xxxx免费观看| 亚洲精品国产精品乱码不99按摩 | 久久精品91| 亚洲午夜av| 蜜臀a∨国产成人精品| 一本久道久久综合婷婷鲸鱼| 欧美中文字幕在线观看| 最新精品在线| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美有码在线视频| 一区二区三区国产精华| 欧美黄色aa电影| 久久久精品一区| 中日韩美女免费视频网站在线观看| 亚洲欧美视频在线| 亚洲高清色综合| 美女精品在线观看| 欧美一区高清| 亚洲图片欧美午夜| 亚洲三级免费电影| 亚洲成色www8888| 国内久久婷婷综合| 国产精品网站在线播放| 欧美日本中文字幕| 米奇777在线欧美播放| 久久国产精品黑丝| 性欧美videos另类喷潮| 一本色道婷婷久久欧美| 欧美成年人视频网站欧美| 久久久国产精彩视频美女艺术照福利| 亚洲特色特黄| 亚洲一区综合| 亚洲午夜在线观看视频在线| 一区二区激情小说| 亚洲精选视频在线| 亚洲精品永久免费| 亚洲美女电影在线| 日韩亚洲欧美综合| 中文在线资源观看网站视频免费不卡| 日韩一级视频免费观看在线| 99香蕉国产精品偷在线观看| 亚洲激情一区二区| 亚洲欧洲精品一区二区三区不卡 | 国产欧美日韩专区发布| 国产网站欧美日韩免费精品在线观看| 国产精品久久久久久久久久ktv| 欧美激情精品久久久久久大尺度 | 欧美国产成人精品| 欧美国产综合视频| 欧美顶级少妇做爰| 免费观看亚洲视频大全| 欧美高清视频免费观看| 欧美国产日产韩国视频| 欧美日韩午夜| 国产精品国产三级国产普通话99 | 久久久www成人免费无遮挡大片| 久久爱www久久做| 久久精品人人做人人爽| 国产一区二区三区在线观看视频| 国产欧美精品一区二区色综合 | 亚洲精品在线免费观看视频| 99这里有精品| 欧美成人一区二区三区在线观看| 免费在线成人av| 欧美极品影院|