• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      C++11實(shí)現(xiàn)可變參數(shù)泛型抽象工廠

      2017-06-30 08:22閔軍羅泓
      軟件工程 2017年5期
      關(guān)鍵詞:異類多態(tài)工廠

      閔軍++羅泓

      摘 要:由于抽象工廠模式有利于達(dá)到高內(nèi)聚低耦合的設(shè)計(jì)目的,因此在軟件設(shè)計(jì)中得到廣泛應(yīng)用。但抽象工廠模式的傳統(tǒng)實(shí)現(xiàn)方式在處理具體產(chǎn)品構(gòu)造函數(shù)參數(shù)不同、異類組合、具體產(chǎn)品數(shù)量繁多的情況時,都顯得很繁瑣、很困難、復(fù)用性很低。針對這一問題,本文以抽象工廠模式為例,應(yīng)用C++11新標(biāo)準(zhǔn)和泛型編程技術(shù),提出一種C++11可變參數(shù)泛型抽象工廠的實(shí)現(xiàn)方式。實(shí)驗(yàn)結(jié)果表明,該方式比傳統(tǒng)實(shí)現(xiàn)方式更為簡潔高效、復(fù)用性更強(qiáng),優(yōu)雅地實(shí)現(xiàn)了對產(chǎn)品類型可變、參數(shù)可變、異類組合的支持。該實(shí)現(xiàn)方式及代碼具有實(shí)用性,可應(yīng)用到軟件項(xiàng)目中。

      關(guān)鍵詞:C++11;泛型;可變參數(shù);抽象工廠;設(shè)計(jì)模式

      中圖分類號:TP311.1 文獻(xiàn)標(biāo)識碼:A

      1 引言(Introduction)

      一種設(shè)計(jì)模式就是解決某一類軟件設(shè)計(jì)問題的可復(fù)用的解決方案。設(shè)計(jì)模式的實(shí)現(xiàn)技術(shù)主要是多態(tài),包括動多態(tài)和靜多態(tài)。起先使用動多態(tài),動多態(tài)是通過繼承和虛函數(shù)實(shí)現(xiàn),在運(yùn)行期間,通過虛函數(shù)調(diào)用不同子類的虛成員函數(shù)來實(shí)現(xiàn)不同的功能。動多態(tài)的綁定是入侵性、插入式的,實(shí)現(xiàn)代價較高。靜多態(tài)是通過模板編程實(shí)現(xiàn)的,通過在編譯期間接口綁定不同的功能代碼來實(shí)現(xiàn)多態(tài)。傳統(tǒng)的靜多態(tài)可以在一定程度上提供非入侵性、非插入式的實(shí)現(xiàn),降低實(shí)現(xiàn)代價。但是,當(dāng)具體產(chǎn)品構(gòu)造函數(shù)參數(shù)不同、需要異類組合、具體產(chǎn)品數(shù)量繁多時,傳統(tǒng)的動多態(tài)和靜多態(tài)實(shí)現(xiàn)起來都很繁瑣、很困難、復(fù)用性很低。

      隨著技術(shù)的發(fā)展,在模板編程的基礎(chǔ)上進(jìn)一步發(fā)展出泛型編程技術(shù),并在C++標(biāo)準(zhǔn)庫(STL)和實(shí)際工程中得到廣泛應(yīng)用[1]。針對設(shè)計(jì)模式傳統(tǒng)實(shí)現(xiàn)方式存在的問題,本文以抽象工廠模式為例,通過C++11新標(biāo)準(zhǔn)泛型編程技術(shù),給出一種可變參數(shù)泛型抽象工廠的實(shí)現(xiàn)方式。

      2 抽象工廠模式(Abstract factory pattern)

      抽象工廠模式屬于創(chuàng)建型模式,其設(shè)計(jì)動機(jī)是:提供一個接口,讓該接口負(fù)責(zé)創(chuàng)建一系列“相關(guān)或者相互依賴的對象”,用戶無需指定工廠和產(chǎn)品的具體的類型、無需了解它們的具體實(shí)現(xiàn),從而繞過常規(guī)的對象創(chuàng)建方式。

      抽象工廠模式結(jié)構(gòu)如圖1所示,抽象工廠將工廠和產(chǎn)品全部抽象化,一個抽象工廠可以生成一組抽象產(chǎn)品,而一個具體工廠則生成一個系列具體產(chǎn)品的特定組合[2]。AbstractFactory定義抽象工廠生成的一組抽象產(chǎn)品的接口,AbstractProductA、AbstractProductB定義某一種抽象產(chǎn)品的接口;具體工廠ConcreteFactory1負(fù)責(zé)創(chuàng)建1系列具體產(chǎn)品類型ProductA1、ProductB1的組合,具體工廠ConcreteFactory2負(fù)責(zé)創(chuàng)建2系列具體產(chǎn)品類型ProductA2、ProductB2的組合,依此類推。

      對象創(chuàng)建時,用戶先創(chuàng)建具體工廠ConcreteFactory1或ConcreteFactory2類的對象,再用ConcreteFactory1創(chuàng)建1系列具體產(chǎn)品類型的組合,或用ConcreteFactory2創(chuàng)建2系列具體產(chǎn)品類型的組合。

      3 泛型編程實(shí)現(xiàn)抽象工廠(Implement abstract

      factory by generic programming)

      抽象工廠傳統(tǒng)實(shí)現(xiàn)方式的主要弱點(diǎn)是類型繁瑣、類型依賴性強(qiáng)、可復(fù)用性弱。一個抽象工廠往往是為某一特定需求而設(shè)計(jì),一般不能在其他場合復(fù)用。還有盡管抽象工廠可以將具體產(chǎn)品的創(chuàng)建委派給特定類型的工廠,但這種委派需要通過純代碼方式實(shí)現(xiàn),沒能充分利用語言所提供的抽象特性。

      在設(shè)計(jì)模式的實(shí)現(xiàn)技術(shù)中,泛型編程能夠提高編程效率、實(shí)現(xiàn)非侵入性實(shí)現(xiàn),大大提高代碼復(fù)用率。在泛型的參與下,許多設(shè)計(jì)可能更為精妙、更加優(yōu)雅、更具擴(kuò)展性[3]。面向?qū)ο缶幊蹋∣OP,Object-Oriented Programming)試圖將數(shù)據(jù)和方法封裝在一起,各種操作都與數(shù)據(jù)類型相關(guān)。泛型編程(GP,Generic Programming)則試圖將數(shù)據(jù)和方法分離開來,將類型參數(shù)化,使得同一種操作可以適用于不同數(shù)據(jù)類型,C++標(biāo)準(zhǔn)庫(STL)就是一種典型應(yīng)用[4]。

      4 C++11實(shí)現(xiàn)可變參數(shù)泛型抽象工廠(Implement

      variable parameter generic abstract factory by

      C++11)

      通過C++11新標(biāo)準(zhǔn)泛型編程技術(shù),能夠?qū)崿F(xiàn)產(chǎn)品類型可變、參數(shù)可變、異類組合的泛型抽象工廠,當(dāng)你需要特定類型抽象工廠時,可隨時復(fù)用而無需再定義專門的抽象工廠實(shí)現(xiàn)。

      4.1 結(jié)構(gòu)圖

      C++11實(shí)現(xiàn)的可變參數(shù)泛型抽象工廠結(jié)構(gòu)如圖2所示,其完整實(shí)現(xiàn)代碼附后。

      具體實(shí)現(xiàn)非常簡潔,只包含兩個模板類:泛型工廠類GenericFactory、內(nèi)嵌類具體產(chǎn)品注冊類Register。這是基于C++11新標(biāo)準(zhǔn)實(shí)現(xiàn)的,必須在支持C++11新標(biāo)準(zhǔn)(2011年ISO發(fā)布)的編譯器中才能正常編譯使用,比如Visual Studio 2013等。

      4.2 泛型工廠類GenericFactory

      該類是該抽象工廠模式的核心,負(fù)責(zé)存儲管理抽象工廠和各種具體工廠數(shù)據(jù)、具體產(chǎn)品的創(chuàng)建等工作[5]。在該類右上角的虛線框中,包含三個模板參數(shù):抽象產(chǎn)品類AbsProduct、具體產(chǎn)品類標(biāo)識KeyConProduct(缺省std::string)、產(chǎn)品類構(gòu)造函數(shù)可變參數(shù)列表0—n項(xiàng)...ArgTypes。最后一個模板參數(shù)便是C++11支持的可變參數(shù)類型,支持可以數(shù)目、可變類型的0—n個參數(shù)[6],下同。不同種類的抽象工廠無需通過不同的公共基類(即傳統(tǒng)抽象工廠中的AbstractFactory)來表達(dá)接口的共性,能夠很優(yōu)雅地實(shí)現(xiàn)異類集合[7]。

      該類通過靜態(tài)變量和靜態(tài)函數(shù)方式實(shí)現(xiàn)簡單的單例模式(singleton),各種構(gòu)造器都是私有的,不允許外部構(gòu)造。外部只能通過調(diào)用靜態(tài)函數(shù)get_Instance獲取唯一的靜態(tài)實(shí)例unique_generic_factory。

      該類只有一個數(shù)據(jù)成員mapConFactory,是std::map類型的私有數(shù)據(jù)成員,用于存放具體產(chǎn)品標(biāo)識KeyConProduct和具體工廠構(gòu)造函數(shù)指針ConFactoryFun組成的鍵值對。外部只能通過調(diào)用該類的公有函數(shù)存取mapConFactory。通過內(nèi)嵌類Register類的實(shí)例化可以將數(shù)據(jù)存入mapConFactory;Unregister函數(shù)可以從mapConFactory中注銷數(shù)據(jù);getConProduct_shared_ptr、getConProduct_unique_ptr函數(shù)可以得到已注冊標(biāo)識為conp的類的一個實(shí)例;getSize函數(shù)可以得到已注冊具體工廠的總數(shù);getKey函數(shù)可以得到已注冊索引為n的類的具體產(chǎn)品標(biāo)識,只不過stl::map默認(rèn)按鍵值類型自動排序(這里默認(rèn)按字母順序),若需要控制排序方式,可以在應(yīng)用程序中增加一個map<索引號,工廠標(biāo)識>變量來實(shí)現(xiàn)。

      4.3 具體產(chǎn)品注冊類Register

      該類是泛型工廠類GenericFactory的內(nèi)嵌類,使用內(nèi)嵌類可明顯簡化設(shè)計(jì)。該類作為抽象工廠的原料和接口,用于創(chuàng)建和注冊具體工廠,將注冊數(shù)據(jù)存入泛型工廠類的GenericFactory::mapConFactory。在該類右上角的虛線框中,只有一個模板參數(shù):具體產(chǎn)品類ConProduct。

      該類很簡單,只包括一個構(gòu)造函數(shù)Register和私有靜態(tài)函數(shù)Create_ConProduct(包含可變參數(shù)列表)。該類與泛型工廠類GenericFactory的關(guān)系也很清晰,只是在創(chuàng)建該類對象時,由其構(gòu)造函數(shù)調(diào)用泛型工廠類的GenericFactory::get_Instance函數(shù),將創(chuàng)建具體產(chǎn)品的Create_ConProduct函數(shù)指針存入泛型工廠類的GenericFactory::mapConFactory。需要注意的是,該類并不實(shí)際創(chuàng)建具體產(chǎn)品對象,具體產(chǎn)品對象的創(chuàng)建,是由用戶通過調(diào)用泛型工廠類的GenericFactory::getConProduct_shared_ptr、GenericFactory::getConProduct_unique_ptr函數(shù)來實(shí)現(xiàn)的。

      這里由于使用了C++11新標(biāo)準(zhǔn)提供的新技術(shù),使得代碼更為精煉、更具擴(kuò)展性??勺儏?shù)類型...ArgTypes使得該接口可以很優(yōu)雅地支持具體產(chǎn)品類構(gòu)造函數(shù)可變參數(shù)列表。智能指針shared_ptr、unique_ptr的使用實(shí)現(xiàn)了自動內(nèi)存管理、無需delete釋放內(nèi)存,share_ptr通過引用計(jì)數(shù)共享所有權(quán),unique_ptr獨(dú)享所有權(quán),可根據(jù)實(shí)際需要選用。使用C++11新特性emplace代替insert向STL容器添加新元素,可以在容器管理的內(nèi)存中直接構(gòu)造新元素,省去構(gòu)造臨時對象、減少內(nèi)存開銷,代碼更為簡潔高效。

      5 實(shí)際使用(Actual use)

      該泛型抽象工廠可以滿足抽象工廠、簡單工廠、可變參數(shù)、異類組合、具體產(chǎn)品數(shù)量繁多等情況的實(shí)現(xiàn)需求。實(shí)際使用很簡單,首先創(chuàng)建各種具體工廠,方法就是創(chuàng)建各種具體產(chǎn)品注冊類Register對象,將各種具體工廠的函數(shù)指針存入泛型工廠類的GenericFactory::mapConFactory。然后,便可以通過泛型工廠類的GenericFactory::get_Instance調(diào)用GenericFactory::getConProduct_shared_ptr、GenericFactory::getConProduct_unique_ptr函數(shù)來創(chuàng)建各種具體產(chǎn)品對象??梢酝ㄟ^函數(shù)封裝實(shí)現(xiàn)抽象工廠的需要,將一系列相關(guān)產(chǎn)品封裝在一個函數(shù)中,實(shí)現(xiàn)一次性創(chuàng)建一系列相關(guān)產(chǎn)品的需要。

      5.1 具體工廠構(gòu)造函數(shù)的參數(shù)可變

      比如,現(xiàn)在已定義Shape基類和Square、Circle兩個子類,便可以通過下面代碼使用該泛型抽象工廠,實(shí)現(xiàn)具體工廠的注冊和具體產(chǎn)品的創(chuàng)建。Square、Circle兩個子類構(gòu)造函數(shù)的參數(shù)可變,參數(shù)個數(shù)、類型都可以各不相同。這里,子類Square的構(gòu)造函數(shù)有三個參數(shù)CPoint、CPoint、unsigned,子類Circle的構(gòu)造函數(shù)有兩個參數(shù)CPoint、int,其結(jié)構(gòu)如圖3所示。

      5.2 具體工廠的異類組合

      比如,跨國公司計(jì)算不同國家員工工資可能用到異類組合。假設(shè)美國員工工資包括獎金B(yǎng)onus、津貼Subsidy、稅收Tax等三個部分,中國員工工資包括獎金B(yǎng)onus、津貼Subsidy、稅收Tax、住房公積金Found等四個部分。使用本文給出的C++11實(shí)現(xiàn)的可變參數(shù)泛型抽象工廠,通過函數(shù)封裝不同抽象工廠的需要,便可輕松實(shí)現(xiàn)這種異類組合,其結(jié)構(gòu)如圖4所示。

      7 優(yōu)點(diǎn)與缺點(diǎn)(Advantages and disadvantages)

      C++11實(shí)現(xiàn)的可變參數(shù)泛型抽象工廠優(yōu)點(diǎn)包括:(1)不同種類的抽象工廠無需通過不同的公共基類(也即傳統(tǒng)抽象工廠中的AbstractFactory)來表達(dá)接口的共性,能夠很優(yōu)雅地實(shí)現(xiàn)異類集合;(2)通過C++11很優(yōu)雅地實(shí)現(xiàn)具體產(chǎn)品類構(gòu)造函數(shù)的可變參數(shù)列表;(3)通過智能指針shared_ptr、unique_ptr實(shí)現(xiàn)自動內(nèi)存管理,無需delete釋放內(nèi)存;(4)泛型編程在編譯期對所有的綁定操作進(jìn)行檢查,具有更好的類型安全性[8];(5)運(yùn)用C++11新特征和內(nèi)嵌類使代碼更為簡潔高效;(6)本文給出的方法及代碼具有實(shí)用性,可應(yīng)用到軟件項(xiàng)目中,其他相關(guān)模式也可參照實(shí)現(xiàn)。其缺點(diǎn)是:(1)使用中編譯報(bào)錯時,理解和查錯較為困難;(2)實(shí)現(xiàn)代碼雖小,但生成的執(zhí)行代碼可能較大。實(shí)際使用時,可根據(jù)其優(yōu)缺點(diǎn)酌情選擇。

      8 結(jié)論(Conclusion)

      綜上所述,抽象工廠模式可以通過傳統(tǒng)的動多態(tài)和靜多態(tài)實(shí)現(xiàn),也可以通過新興的泛型和模板實(shí)現(xiàn)。抽象工廠模式的傳統(tǒng)實(shí)現(xiàn)方式在處理具體產(chǎn)品構(gòu)造函數(shù)參數(shù)不同、異類組合、具體產(chǎn)品數(shù)量繁多的情況時,都顯得很繁瑣、很困難、復(fù)用性很低。針對這一問題,本文以抽象工廠模式為例,應(yīng)用C++11新標(biāo)準(zhǔn)和泛型編程技術(shù),給出了一種C++11可變參數(shù)泛型抽象工廠的實(shí)現(xiàn)方式。該方式比傳統(tǒng)實(shí)現(xiàn)方式更為簡潔高效、復(fù)用性更強(qiáng),優(yōu)雅地實(shí)現(xiàn)了對產(chǎn)品類型可變、參數(shù)可變、異類組合的支持。

      參考文獻(xiàn)(References)

      [1] Bemardi ML,Cimitile M,Lucca GD.Design pattem detection using a DSL-driven graph matching approach[J].Journal of Software Evolution&Process,2014,26(12):1233-1266.

      [2] B Rasool G,Mader P.A customizable approach to design pattems recognition based 011 feature types[J].Arabian Journal for Science&Engineering,2014,39(12):8851-8873.

      [3] 許涵斌,等.一種基于結(jié)構(gòu)查詢的UML設(shè)計(jì)模式識別方法[J].計(jì)算機(jī)科學(xué),2014,41(11):50-55.

      [4] B Matthew H.Austere(美).侯捷,譯.泛型編程與STL[M].北京:中國電力出版社,2003.

      [5] BLarman.C.(美).李洋,等,譯.UML和模式應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2006.

      [6] B Michael Wong(加),IBM XL編譯器中國開發(fā)團(tuán)隊(duì).深入理解C++11:C++11新特性解析與應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2013.

      [7] B Gamma Erich(美),等.李英軍,等,譯.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].北京:機(jī)械工業(yè)出版社,2000.

      [8] B Joshua Kerievsky(美).楊光,劉基誠,譯.重構(gòu)與模式(修訂版)[M].北京:人民郵電出版社,2013.

      作者簡介:

      閔 軍(1966-),男,碩士,研究員.研究領(lǐng)域:C++程序設(shè)計(jì),設(shè)計(jì)模式,計(jì)算機(jī)網(wǎng)絡(luò).

      羅 泓(1970-),女,大專,工程師.研究領(lǐng)域:數(shù)據(jù)分析與處理,電路設(shè)計(jì),信息管理系統(tǒng).

      猜你喜歡
      異類多態(tài)工廠
      分層多態(tài)加權(quán)k/n系統(tǒng)的可用性建模與設(shè)計(jì)優(yōu)化
      參差多態(tài)而功不唐捐
      毛毛蟲中的異類
      魚中的異類
      鸚鵡中的異類
      但愿多些這樣的“異類”
      離散制造MES在照明工廠的實(shí)施與應(yīng)用
      煙堿型乙酰膽堿受體基因多態(tài)與早發(fā)性精神分裂癥的關(guān)聯(lián)研究
      植物工廠
      博客| 宁化县| 大渡口区| 黑龙江省| 信丰县| 三门峡市| 明光市| 平乡县| 宜春市| 怀远县| 维西| 明溪县| 西乡县| 大庆市| 浏阳市| 斗六市| 新余市| 五华县| 南平市| 基隆市| 湟源县| 资溪县| 凤阳县| 赫章县| 临安市| 屏南县| 萨迦县| 二连浩特市| 朝阳县| 尚志市| 丰都县| 昌黎县| 康保县| 朝阳市| 井冈山市| 汶上县| 抚远县| 台南县| 泸西县| 延川县| 湖州市|