设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式
抽象工廠和生成器模式常常被混淆,因為他們之間實在有很多的相似點,比如都是創建型模式,都隱藏產品具體細節,都向用戶提供一個包含一系列接口的對象。
這個說法比較抽象。我們通過實現來看看為什么容易混淆。
抽象工廠
我們使用一個汽車生產來做例子。抽象工廠模式如下:
有一個抽象工廠類名為Factory,工廠的作用是生產車的不同部件。
有一個奔馳工廠BenzFactory繼承了這個Factory,專門用來生產奔馳車的部件。
有一個奔馳工廠BMWFactory繼承了這個Factory,專門用來生產寶馬車的部件。
有一個消費者類Consumer,專門組裝這些工廠生產的部件。
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)模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IE改善七大手法| ECRS工时分析软件
- 下一篇: 服务器远程ghost,神奇Ghost 轻