亚洲国产区中文,国产精品91高清,亚洲精品中文字幕久久久久,亚洲欧美另类久久久精品能播放

                  族譜網(wǎng) 頭條 人物百科

                  抽象工廠

                  2020-10-16
                  出處:族譜網(wǎng)
                  作者:阿族小譜
                  瀏覽:708
                  轉(zhuǎn)發(fā):0
                  評論:0
                  定義抽象工廠模式的實質(zhì)是“提供接口,創(chuàng)建一系列相關(guān)或獨立的對象,而不指定這些對象的具體類。”使用具體的工廠決定了創(chuàng)建對象的具體類型,而且工廠就是對象實際創(chuàng)建的地方(比如在C++中,用“new”操作符創(chuàng)建對象)。然而,抽象工廠只返回一個指向創(chuàng)建的對象的抽象引用(或指針)。這樣,客戶端程序調(diào)用抽象工廠引用的方法,由具體工廠完成對象創(chuàng)建,然后客戶端程序得到的是抽象產(chǎn)品的引用。如此使客戶端代碼與對象的創(chuàng)建分離開來。因為工廠僅僅返回一個抽象產(chǎn)品的引用(或指針),所以客戶端程序不知道(也不會牽絆于)工廠創(chuàng)建對象的具體類型。然而,工廠知道具體對象的類型;例如,工廠可能從配置文件中讀取某種類型。這時,客戶端沒有必要指定具體類型,因為已經(jīng)在配置文件中指定了。通常,這意味著:客戶端代碼不知道任何具體類型,也就沒必要引入任何相關(guān)的頭文件或類定義??蛻舳舜a僅僅處理抽象類型。工廠確實創(chuàng)建了具體類型的對象,但是客戶...

                  定義

                  抽象工廠模式的實質(zhì)是“提供接口,創(chuàng)建一系列相關(guān)或獨立的對象,而不指定這些對象的具體類。”

                  使用

                  具體的工廠決定了創(chuàng)建對象的具體類型,而且工廠就是對象實際創(chuàng)建的地方(比如在C++中,用“new”操作符創(chuàng)建對象)。然而,抽象工廠只返回一個指向創(chuàng)建的對象的抽象引用(或指針)。

                  這樣,客戶端程序調(diào)用抽象工廠引用的方法,由具體工廠完成對象創(chuàng)建,然后客戶端程序得到的是抽象產(chǎn)品的引用。如此使客戶端代碼與對象的創(chuàng)建分離開來。

                  因為工廠僅僅返回一個抽象產(chǎn)品的引用(或指針),所以客戶端程序不知道(也不會牽絆于)工廠創(chuàng)建對象的具體類型。然而,工廠知道具體對象的類型;例如,工廠可能從配置文件中讀取某種類型。這時,客戶端沒有必要指定具體類型,因為已經(jīng)在配置文件中指定了。通常,這意味著:

                  客戶端代碼不知道任何具體類型,也就沒必要引入任何相關(guān)的頭文件或類定義??蛻舳舜a僅僅處理抽象類型。工廠確實創(chuàng)建了具體類型的對象,但是客戶端代碼僅使用這些對象的抽象接口來訪問它們。

                  如果要增加一個具體類型,只需要修改客戶端代碼使用另一個工廠即可,而且這個修改通常只是一個文件中的一行代碼。不同的工廠創(chuàng)建不同的具體類型的對象,但是和以前一樣返回一個抽象類型的引用(或指針),因此客戶端代碼的其他部分不需要任何改動。這樣比修改客戶端代碼創(chuàng)建新類型的對象簡單多了。如果是后者的話,需要修改代碼中每一個創(chuàng)建這種對象的地方(而且需要注意的是,這些地方都知道對象的具體類型,而且需要引入具體類型的頭文件或類定義)。如果所有的工廠對象都存儲在全局的單例對象中,所有的客戶端代碼到這個單例中訪問需要的工廠,那么,更換工廠就非常簡單了,僅僅需要更改這個單例對象即可。

                  結(jié)構(gòu)

                  LePUS3圖

                  類圖

                  GuiFactory 接口中的 createButton 方法返回 Button 類型的對象。返回 Button 的哪種實現(xiàn)依賴于使用 GuiFactory 的哪種實現(xiàn)。

                  需要注意的是,為了簡潔起見,以上類圖僅僅展示了創(chuàng)建一個類型對象的工廠。而在抽象工廠模式中,通常一個工廠能夠創(chuàng)建若干種不同類型的對象。

                  代碼舉例

                  假設(shè)我們有兩種產(chǎn)品接口 Button 和 Border ,每一種產(chǎn)品都支持多種系列,比如 Mac 系列和 Windows 系列。這樣每個系列的產(chǎn)品分別是 MacButton, WinButton, MacBorder, WinBorder 。為了可以在運行時刻創(chuàng)建一個系列的產(chǎn)品族,我們可以為每個系列的產(chǎn)品族創(chuàng)建一個工廠 MacFactory 和 WinFactory 。每個工廠都有兩個方法 CreateButton 和 CreateBorder 并返回對應(yīng)的產(chǎn)品,可以將這兩個方法抽象成一個接口 AbstractFactory 。這樣在運行時刻我們可以選擇創(chuàng)建需要的產(chǎn)品系列。

                  C++

                  我們的產(chǎn)品結(jié)構(gòu)是這樣的

                  classButton;// Abstract ClassclassMacButton:publicButton{};classWinButton:publicButton{};classBorder;// Abstract ClassclassMacBorder:publicBorder{};classWinBorder:publicBorder{};

                  對應(yīng)的工廠是這樣的

                  classAbstractFactory{public:virtualButton*CreateButton()=0;virtualBorder*CreateBorder()=0;};classMacFactory:publicAbstractFactory{public:MacButton*CreateButton(){returnnewMacButton;}MacBorder*CreateBorder(){returnnewMacBorder;}};classWinFactory:publicAbstractFactory{public:WinButton*CreateButton(){returnnewWinButton;}WinBorder*CreateBorder(){returnnewWinBorder;}};

                  那么客戶可以根據(jù)需要選擇 Mac 風(fēng)格或者 Win 風(fēng)格來創(chuàng)建 Button 或 Border

                  AbstractFactory*fac;switch(style){caseMAC:fac=newMacFactory;break;caseWIN:fac=newWinFactory;break;}Button*button=fac->CreateButton();Border*border=fac->CreateBorder();

                  PHP

                  /*************************************************************************** * AbstractFactory.php * ------------------- * Time : 2006-11-11 * Coder : rollenc(http://www.rollenc.com) * syre(http://syre.blogbus.com) ***************************************************************************/abstractclassAbstractFactory{abstractpublicfunctionCreateButton();abstractpublicfunctionCreateBorder();}classMacFactoryextendsAbstractFactory{publicfunctionCreateButton(){returnnewMacButton();}publicfunctionCreateBorder(){returnnewMacBorder();}}classWinFactoryextendsAbstractFactory{publicfunctionCreateButton(){returnnewWinButton();}publicfunctionCreateBorder(){returnnewWinBorder();}}classButton{}classBorder{}classMacButtonextendsButton{function__construct(){echo"MacButton is created"."\n";}}classMacBorderextendsBorder{function__construct(){echo"MacBorder is created"."\n";}}classWinButtonextendsButton{function__construct(){echo"WinButton is created"."\n";}}classWinBorderextendsBorder{function__construct(){echo"WinBorder is created"."\n";}}?>

                  那么客戶可以根據(jù)需要選擇 Mac 風(fēng)格或者 Win 風(fēng)格的 Button 或 Border 來創(chuàng)建

                  $type="Mac";//value by user.if(!in_array($type,array("Win","Mac")))die("Type Error");$factoryClass=$type."Factory";$factory=new$factoryClass;$factory->CreateButton();$factory->CreateBorder();?>

                  Java

                  使用上面的例子

                  publicinterfaceButton{}publicinterfaceBorder{}

                  實現(xiàn)抽象類

                  publicclassMacButtonimplementsButton{}publicclassMacBorderimplementsBorder{}publicclassWinButtonimplementsButton{}publicclassWinBorderimplementsBorder{}

                  接著實現(xiàn)工廠

                  publicclassButtonFactory{publicstaticButtoncreateMacButton(){returnnewMacButton();}publicstaticButtoncreateWinButton(){returnnewWinButton();}}

                  publicclassBorderFactory{publicstaticBordercreateMacBorder(){returnnewMacBorder();}publicstaticBordercreateWinBorder(){returnnewWinBorder();}}

                  適用性

                  在以下情況可以考慮使用抽象工廠模式:

                  一個系統(tǒng)要獨立于它的產(chǎn)品的創(chuàng)建、組合和表示時。

                  一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。

                  需要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進(jìn)行聯(lián)合使用時。

                  提供一個產(chǎn)品類庫,而只想顯示它們的接口而不是實現(xiàn)時。

                  優(yōu)點

                  具體產(chǎn)品從客戶代碼中被分離出來

                  容易改變產(chǎn)品的系列

                  將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建

                  缺點

                  在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口

                  參見

                  工廠方法模式

                  單例模式

                  設(shè)計模式 (計算機(jī))


                  免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。

                  ——— 沒有了 ———
                  編輯:阿族小譜

                  更多文章

                  更多精彩文章
                  評論 {{commentTotal}} 文明上網(wǎng)理性發(fā)言,請遵守《新聞評論服務(wù)協(xié)議》
                  游客
                  發(fā)表評論
                  • {{item.userName}} 舉報

                    {{item.content}}

                    {{item.time}} {{item.replyListShow ? '收起' : '展開'}}評論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}

                    回復(fù)評論
                  加載更多評論
                  打賞作者
                  “感謝您的打賞,我會更努力的創(chuàng)作”
                  — 請選擇您要打賞的金額 —
                  {{item.label}}
                  {{item.label}}
                  打賞成功!
                  “感謝您的打賞,我會更努力的創(chuàng)作”
                  返回
                  打賞
                  私信

                  推薦閱讀

                  · 工廠
                  早期的工廠中國普遍相信古代中國首先出現(xiàn)工廠。據(jù)《周禮》記載官營和民營的作坊、工場、小型工廠在周朝(771-221BC)就出現(xiàn)了。到宋代(960-1279AD),商品流通進(jìn)一步發(fā)展,甚至出現(xiàn)了世界最早的紙幣。為適應(yīng)商品市場的需要,出現(xiàn)了更多的民營小型工廠,如瓷器、冶煉、造紙、印刷、造船等專業(yè)工廠。而宋朝官方也官營的兵器工廠,如北宋初期的弓弩院、造箭院各有工匠一千多人。阿拉伯歐洲歐洲史上雖然在古羅馬時代已經(jīng)出現(xiàn)類似工廠的組織,但是真正出現(xiàn)工廠這個英文單詞的時間是公元1104年,地點是意大利威尼斯的造船廠。工廠出現(xiàn)的時間比工業(yè)革命早上了數(shù)百年。在造船廠中船只以裝配線的形式在生產(chǎn)線上由組件裝嵌而成。一只船需用約一天建造,而工廠全盛時期曾有超過16,000名員工。英國伯明翰的蘇豪制造廠(SohoManufactory,1761至1990年)被公認(rèn)為全球首座現(xiàn)代工廠。工廠發(fā)展最初的工廠(例如在18世紀(jì)...
                  · 抽象化
                  抽象與抽象層抽象就是把一個問題或模型,以不同規(guī)則或方法所得出的不同的解(求解方法和解本身即抽象層),這些不同的解可以組合并還原成問題或模型的本身。抽象的意義是可以忽略不是求解過程中必需的解。例如要用計算機(jī)程序去模擬“人”,在描述了人的動作(飲食、思考、移動等)匹配設(shè)計要求后(如可完整表達(dá)“人”在坐下時候的動作),其他“人”的細(xì)節(jié)(軀干、器官、細(xì)胞活動乃至人際關(guān)系)都可以忽略,以集中設(shè)計需要的功能,并減低程序的復(fù)雜度。為了使抽象的成品(算法)不會出現(xiàn)問題,要注意抽象時是否漏掉重要特征。編程語言在程序設(shè)計中,高級語言是對機(jī)器指令序列的抽象。高級語言的出現(xiàn),使得程序的編寫得以簡化,極大提高了程序的編寫效率。隨著軟件技術(shù)的發(fā)展,組件技術(shù)進(jìn)一步提升了程序抽象的級別。另一種可取的替代方法是設(shè)計一種語言機(jī)制,允許程序師在需要的時候構(gòu)建自己的抽象方法。一個通用的機(jī)制是使用過程(procedure)。通過分...
                  · 抽象化
                  降低復(fù)雜度抽象化主要是為了使復(fù)雜度降低,以得到論域中,較簡單的概念,好讓人們能夠控制其過程或以綜觀的角度來了解許多特定的事態(tài)。思考過程在哲學(xué)里,“抽象化”是一種將觀念抽離原本客體的思想過程。抽象化使用了簡單的手法,其將具體的細(xì)節(jié)保留成含糊、曖昧或無定義的樣子;因此對于抽象事物的有效溝通,需要在溝通的發(fā)受者之間,有著某種直覺或共同的經(jīng)驗。貓坐在墊子上(圖1)貓坐在墊子上的概念圖(圖2)例如,許多的物件都可以說是紅色。同樣地,許多的東西可以在一個表面上(如“圖1”)。紅色和“在…上”之關(guān)系等性質(zhì)都是實質(zhì)物件的抽象化。尤其是,“圖2”的概念圖只標(biāo)示了三個方格、兩個橢圓和四個箭頭(和其九個標(biāo)簽),但“圖1”則表現(xiàn)出了更多個圖像上的細(xì)節(jié),其內(nèi)含在圖內(nèi)的大量關(guān)系,比在“圖2”中的九個明顯的細(xì)節(jié)要多得許多?!皥D2”明顯地詳述出圖表中物件之間的關(guān)系。例如,“agent”和“CAT:Elsie”之間的箭頭圖...
                  · 夢工廠
                  發(fā)展回顧夢工廠的縮寫“SKG”代表的是公司的三個共同創(chuàng)始人,S代表斯蒂芬·斯皮爾伯格(影片監(jiān)制及AmblinEntertainment的創(chuàng)始人),K代表Katzenberg(迪士尼前任首席),而G代表大衛(wèi)·葛芬(GeffenRecords的創(chuàng)始人)。1999至2001年,夢工廠連續(xù)三年都獲得奧斯卡最佳電影獎,獲獎電影是《美國麗人》、《角斗士》和《美麗心靈》(后兩部與環(huán)球影業(yè)合作)。2016年8月23日,康卡斯特旗下NBC環(huán)球成功以38億美元收購夢工廠。合作生產(chǎn)電影此列表僅列出部分電影,并非完整清單。20世紀(jì)??怂?部電影與20世紀(jì)??怂购献鳎骸段C(jī)四伏》、《重返榮耀》、《荒島余生》、《少數(shù)派報告》及《毀滅之路》派拉蒙環(huán)球工作室有8部電影與環(huán)球影業(yè)聯(lián)合制作:《魔幻小戰(zhàn)士》、《角斗士》、《拜見岳父大人》、《美麗心靈》、《壯志奔騰》、《魔法靈貓》華納兄弟哥倫比亞制片五部影片與哥倫比亞影片合作:《...
                  · 抽象代數(shù)
                  歷史如同其他的數(shù)學(xué)領(lǐng)域一般,具體的問題與例子于抽象代數(shù)的發(fā)展中發(fā)揮著重要的作用。19世紀(jì)末期,許多(也許是最多)的問題都在某些程度上與代數(shù)方程的理論有關(guān)。主要問題包括:解線性方程組的解,這導(dǎo)致了線性代數(shù)。試圖找出高次一般多項式方程的公式解,因而發(fā)現(xiàn)了群可以作為對稱的抽象表示。二次以上的丟番圖方程之算術(shù)研究,直接影響了環(huán)與理想等概念的形成。許多抽象代數(shù)的教科書會從各類代數(shù)結(jié)構(gòu)的公理化定義開始,然后逐步建立其性質(zhì)。這會造成一個錯誤的印象,讓人以為先有代數(shù)公理,然后才以這些公理作為基礎(chǔ),推動更進(jìn)一步的研究。歷史發(fā)展的真正順序幾乎正好相反。例如,19世紀(jì)時,超復(fù)數(shù)的誕生是因為在運動學(xué)與物理學(xué)上的需求,但當(dāng)時要理解這個概念卻很困難。大多數(shù)被認(rèn)為是代數(shù)一部分的理論一開始都是在不同數(shù)學(xué)分支里的不同事實,因為需要一個共同的架構(gòu)作為這些結(jié)論的依據(jù)基礎(chǔ),而漸漸地演變成統(tǒng)合在一套共同概念之基礎(chǔ)上。此一逐漸統(tǒng)合的...

                  關(guān)于我們

                  關(guān)注族譜網(wǎng) 微信公眾號,每日及時查看相關(guān)推薦,訂閱互動等。

                  APP下載

                  下載族譜APP 微信公眾號,每日及時查看
                  掃一掃添加客服微信