999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++11實現可變參數泛型抽象工廠

2017-06-30 08:22:59閔軍羅泓
軟件工程 2017年5期
關鍵詞:產品

閔軍++羅泓

摘 要:由于抽象工廠模式有利于達到高內聚低耦合的設計目的,因此在軟件設計中得到廣泛應用。但抽象工廠模式的傳統實現方式在處理具體產品構造函數參數不同、異類組合、具體產品數量繁多的情況時,都顯得很繁瑣、很困難、復用性很低。針對這一問題,本文以抽象工廠模式為例,應用C++11新標準和泛型編程技術,提出一種C++11可變參數泛型抽象工廠的實現方式。實驗結果表明,該方式比傳統實現方式更為簡潔高效、復用性更強,優雅地實現了對產品類型可變、參數可變、異類組合的支持。該實現方式及代碼具有實用性,可應用到軟件項目中。

關鍵詞:C++11;泛型;可變參數;抽象工廠;設計模式

中圖分類號:TP311.1 文獻標識碼:A

1 引言(Introduction)

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

隨著技術的發展,在模板編程的基礎上進一步發展出泛型編程技術,并在C++標準庫(STL)和實際工程中得到廣泛應用[1]。針對設計模式傳統實現方式存在的問題,本文以抽象工廠模式為例,通過C++11新標準泛型編程技術,給出一種可變參數泛型抽象工廠的實現方式。

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

抽象工廠模式屬于創建型模式,其設計動機是:提供一個接口,讓該接口負責創建一系列“相關或者相互依賴的對象”,用戶無需指定工廠和產品的具體的類型、無需了解它們的具體實現,從而繞過常規的對象創建方式。

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

對象創建時,用戶先創建具體工廠ConcreteFactory1或ConcreteFactory2類的對象,再用ConcreteFactory1創建1系列具體產品類型的組合,或用ConcreteFactory2創建2系列具體產品類型的組合。

3 泛型編程實現抽象工廠(Implement abstract

factory by generic programming)

抽象工廠傳統實現方式的主要弱點是類型繁瑣、類型依賴性強、可復用性弱。一個抽象工廠往往是為某一特定需求而設計,一般不能在其他場合復用。還有盡管抽象工廠可以將具體產品的創建委派給特定類型的工廠,但這種委派需要通過純代碼方式實現,沒能充分利用語言所提供的抽象特性。

在設計模式的實現技術中,泛型編程能夠提高編程效率、實現非侵入性實現,大大提高代碼復用率。在泛型的參與下,許多設計可能更為精妙、更加優雅、更具擴展性[3]。面向對象編程(OOP,Object-Oriented Programming)試圖將數據和方法封裝在一起,各種操作都與數據類型相關。泛型編程(GP,Generic Programming)則試圖將數據和方法分離開來,將類型參數化,使得同一種操作可以適用于不同數據類型,C++標準庫(STL)就是一種典型應用[4]。

4 C++11實現可變參數泛型抽象工廠(Implement

variable parameter generic abstract factory by

C++11)

通過C++11新標準泛型編程技術,能夠實現產品類型可變、參數可變、異類組合的泛型抽象工廠,當你需要特定類型抽象工廠時,可隨時復用而無需再定義專門的抽象工廠實現。

4.1 結構圖

C++11實現的可變參數泛型抽象工廠結構如圖2所示,其完整實現代碼附后。

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

4.2 泛型工廠類GenericFactory

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

該類通過靜態變量和靜態函數方式實現簡單的單例模式(singleton),各種構造器都是私有的,不允許外部構造。外部只能通過調用靜態函數get_Instance獲取唯一的靜態實例unique_generic_factory。

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

4.3 具體產品注冊類Register

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

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

這里由于使用了C++11新標準提供的新技術,使得代碼更為精煉、更具擴展性。可變參數類型...ArgTypes使得該接口可以很優雅地支持具體產品類構造函數可變參數列表。智能指針shared_ptr、unique_ptr的使用實現了自動內存管理、無需delete釋放內存,share_ptr通過引用計數共享所有權,unique_ptr獨享所有權,可根據實際需要選用。使用C++11新特性emplace代替insert向STL容器添加新元素,可以在容器管理的內存中直接構造新元素,省去構造臨時對象、減少內存開銷,代碼更為簡潔高效。

5 實際使用(Actual use)

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

5.1 具體工廠構造函數的參數可變

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

5.2 具體工廠的異類組合

比如,跨國公司計算不同國家員工工資可能用到異類組合。假設美國員工工資包括獎金Bonus、津貼Subsidy、稅收Tax等三個部分,中國員工工資包括獎金Bonus、津貼Subsidy、稅收Tax、住房公積金Found等四個部分。使用本文給出的C++11實現的可變參數泛型抽象工廠,通過函數封裝不同抽象工廠的需要,便可輕松實現這種異類組合,其結構如圖4所示。

7 優點與缺點(Advantages and disadvantages)

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

8 結論(Conclusion)

綜上所述,抽象工廠模式可以通過傳統的動多態和靜多態實現,也可以通過新興的泛型和模板實現。抽象工廠模式的傳統實現方式在處理具體產品構造函數參數不同、異類組合、具體產品數量繁多的情況時,都顯得很繁瑣、很困難、復用性很低。針對這一問題,本文以抽象工廠模式為例,應用C++11新標準和泛型編程技術,給出了一種C++11可變參數泛型抽象工廠的實現方式。該方式比傳統實現方式更為簡潔高效、復用性更強,優雅地實現了對產品類型可變、參數可變、異類組合的支持。

參考文獻(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] 許涵斌,等.一種基于結構查詢的UML設計模式識別方法[J].計算機科學,2014,41(11):50-55.

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

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

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

[7] B Gamma Erich(美),等.李英軍,等,譯.設計模式:可復用面向對象軟件的基礎[M].北京:機械工業出版社,2000.

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

作者簡介:

閔 軍(1966-),男,碩士,研究員.研究領域:C++程序設計,設計模式,計算機網絡.

羅 泓(1970-),女,大專,工程師.研究領域:數據分析與處理,電路設計,信息管理系統.

猜你喜歡
產品
好產品,可持續
現代裝飾(2022年4期)2022-08-31 01:39:32
從靈感出發,邂逅好產品
現代裝飾(2022年3期)2022-07-05 05:55:06
新產品
“三無”產品
快樂語文(2021年36期)2022-01-18 05:48:46
OPPO:堅守本分,將產品做到極致
金橋(2021年4期)2021-05-21 08:19:22
”這些產品,我不打算回購。
中國化妝品(2018年6期)2018-07-09 03:12:40
拒絕平凡,如何讓你的產品變“有趣”?
中國化妝品(2018年6期)2018-07-09 03:12:32
2015產品LOOKBOOK直擊
Coco薇(2015年1期)2015-08-13 02:23:50
golo6可以聽的OBD產品
新產品
玩具(2009年10期)2009-11-04 02:33:14
主站蜘蛛池模板: 97人人做人人爽香蕉精品| 亚洲视频色图| 久久免费看片| 国产成人综合欧美精品久久| 国产一级毛片yw| 亚洲无线国产观看| 国产精品欧美激情| 国产欧美视频综合二区| 亚洲精品中文字幕无乱码| 国产精品久久久久久搜索 | 国产精品99久久久久久董美香| 免费一级无码在线网站| 美女潮喷出白浆在线观看视频| 在线欧美日韩| 黄片一区二区三区| 91久久青青草原精品国产| 久久婷婷六月| 国产一区二区精品福利| 国产日韩欧美中文| 国产成人无码播放| 制服丝袜一区二区三区在线| 在线观看亚洲天堂| 亚洲AV成人一区二区三区AV| 欧美亚洲国产日韩电影在线| 99这里只有精品在线| 亚洲bt欧美bt精品| 欧美亚洲国产精品第一页| 高清国产在线| 亚洲欧洲日韩久久狠狠爱| 精品综合久久久久久97超人| 日韩大乳视频中文字幕| 亚洲码一区二区三区| 免费国产黄线在线观看| 亚洲日韩国产精品综合在线观看| 欲色天天综合网| 欧美午夜网站| 亚洲狠狠婷婷综合久久久久| 精品伊人久久久大香线蕉欧美 | 亚洲国产精品VA在线看黑人| 国产精品播放| 美女内射视频WWW网站午夜| 91色爱欧美精品www| 欧美日本视频在线观看| 免费A级毛片无码免费视频| 爆乳熟妇一区二区三区| 欧美高清国产| 久久这里只有精品66| 激情网址在线观看| 国产女人在线视频| www.91在线播放| 精品剧情v国产在线观看| 欧美、日韩、国产综合一区| 在线免费无码视频| 精品视频在线一区| 欧美第二区| 久久天天躁夜夜躁狠狠| 无码中文字幕精品推荐| 欧美色综合久久| 中文字幕无线码一区| 久久精品亚洲热综合一区二区| lhav亚洲精品| 久久久久国产一区二区| 国产一级做美女做受视频| 免费一级毛片在线观看| 国产超碰在线观看| 国产精品手机在线观看你懂的| 久久精品人人做人人爽电影蜜月| 99久视频| 97视频在线观看免费视频| 91网在线| 9丨情侣偷在线精品国产| 激情综合激情| 午夜日b视频| 日本人又色又爽的视频| 亚洲精品人成网线在线| 亚洲va视频| 黄色一级视频欧美| 亚洲人成网站色7799在线播放| 国产精品流白浆在线观看| 亚洲福利网址| 精品偷拍一区二区| 高清视频一区|