日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式

發布時間:2023/12/31 asp.net 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

抽象工廠和生成器模式常常被混淆,因為他們之間實在有很多的相似點,比如都是創建型模式,都隱藏產品具體細節,都向用戶提供一個包含一系列接口的對象。
這個說法比較抽象。我們通過實現來看看為什么容易混淆。

抽象工廠

我們使用一個汽車生產來做例子。抽象工廠模式如下:
有一個抽象工廠類名為Factory,工廠的作用是生產車的不同部件。
有一個奔馳工廠BenzFactory繼承了這個Factory,專門用來生產奔馳車的部件。
有一個奔馳工廠BMWFactory繼承了這個Factory,專門用來生產寶馬車的部件。
有一個消費者類Consumer,專門組裝這些工廠生產的部件。

Class Factory { public:virtua Car* createCar();//生產車virtua Wheel* createWheel();//生產輪子Shell* Wheel* createShell();//生產車殼virtua Engine* createEngine();//生產引擎 } Class BenzFactory:public Factory//奔馳工廠 {BenzCar* createCar();//生產奔馳車Wheel* createWheel();//生產奔馳輪子Shell* createShell();//生產奔馳車殼Engine* createEngine();//生產奔馳引擎 } Class BMWFactory:public Factory//寶馬工廠 {BMWCar* createCar();//生產寶馬車Wheel* createWheel();//生產寶馬輪子Shell* createShell();//生產寶馬車殼Engine* createEngine();//生產寶馬引擎 }class Consumer {Car* createCar(Factory * factory){auto car= factory->createCar();auto wheel= factory->createWheel();auto shell= factory->createShell();auto engine= factory->createEngine();//一大堆組裝過程,這里用戶得自己處理wheel->check();//輪胎檢查shell->check();//車殼檢查shell->setColor();//車殼上漆engine->check();//引擎檢查car->add(wheel);car->add(shell);car->add(engine);return car;} }

Builder模式

Class Builder { public:virtua Car* getCar();//最后Car組裝完成后返回carvirtua Car* buildCar();//生成一個什么都沒有的車virtua Wheel* buildWheel();//生成輪子,并檢查,組裝Shell* Wheel* buildShell();//生成車殼,并檢查和噴漆,組裝virtua Engine* buildEngine();//生成引擎,并檢查,組裝 protect:Builder (); } Class BenzBuilder:public Builder//奔馳工廠 { public:BenzCar* getCar(){return _current;};//得到組裝后的奔馳車virtua Car* buildCar(){_current=new BenzCar();};//生成一個什么都沒有的奔馳車Wheel* buildWheel();//生成奔馳輪子,并檢查,組裝Shell* buildShell();//生成奔馳車殼,并檢查和噴漆,組裝Engine* buildEngine();//生成奔馳引擎,并檢查,組裝 private://注意與工廠模式的區別 BenzBuilder(){current=0};BenzCar* _current; } Class BMWBuilder:public Builder//寶馬工廠 { public:BMWCar* getCar(){return _current;};//得到組裝完成的寶馬車virtua Car* buildCar(){_current=new BMWCar();};//生成一個什么都沒有的寶馬車Wheel* buildWheel();//生成寶馬輪子,并檢查,組裝Shell* buildShell();//生成寶馬車殼,并檢查和噴漆,組裝Engine* buildEngine();//生成寶馬引擎,并檢查,組裝 private://注意與工廠模式的區別BMWBuilder(){current=0};BMWCar* _current; }class Consumer{Car* getCar(Builder* builder){builder->buildCar();builder->buildWheel();builder->buildShell();builder-> buildEngine();//對比工廠模式中的消費者,這里的消費者不需要自己去實現組裝 return builder->getCar();} }

都有創建對象,都對用戶提供一組接口,都有一個消費者,使用方式都是一樣的。
需要注意的是上面的Consumer在抽象工廠模式被稱為消費者,這個消費者把工廠生產的東西拿過來自己檢查,自己噴漆,自己組裝,是個DIY狂人。
但是Consumer在生成器模式中的定位更像是一個消費者,因為這個消費者不知道檢查部件,不知道噴漆,不知道組裝,但是他把任務交給了生成器類本身,自己只需要指明要用哪些東西罷了。

所以,他們之間的區別到底是什么呢?

  • Builder類中的direction方法會替代Factory模式中消費者的部分工作,主要是隱藏了最終產品的實現細節,比如汽車的組裝細節在Builder中被隱藏在Builder類內部,而Factory沒有隱藏;

  • Builder可以認為是將Factory再封裝,所以,Builder沒有Factory靈活,而Builder對于固定類型的對象創建更方便。消費者如果想要組裝不同類型的東西,比如奔馳的引擎和寶馬的外殼,那只能使用Factory模式。

  • 使用Factory或Builder的好處

  • 實現了消費者與產品類的解耦合,消費者只需要知道工廠類的生產對應產品的接口,無需知道具體有哪些產品實現類。
  • 正因為解耦了高層調用類和低層實現類的關系,產品類具體如何變化,消費者是不關心的,修改只需要修改底層實現類,這為框架的擴展提供便利。
  • 總結

    工廠模式較Builder模式靈活,因為其支持一個零件一個零件的返回,用戶可以自己選擇零件拼裝成一個對象。而Builder模式對創建復雜對象更方便,因為他將復雜對象的內部組裝完全隱藏,用戶不必勞神親自每次都去自己創建一大隊零件然后自己組裝。
    在設計的可擴展性和應用場景上,兩個模式并沒有太大的區別,他們都實現了用戶和產品的解耦合,但是個人認為Builder模式實現的復雜性高一點。在使用上沒有明顯的區別的情況下,還是使用Factory吧。

    總結

    以上是生活随笔為你收集整理的设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。