/************************************************************************ * 建造者模式學習筆記[C++] * Author: 陳相禮 * Time: 2009.12.04 * Compiler: VC8 ************************************************************************/ #include "BuilderPattern.h" #include "BuilderPattern1.h" #include <iostream> #include <string> using namespace std; void main( void ) { //------------------建造者模式原理類測試------------------- CDirector *director = new CDirector();// 指揮者用CConcreteBuilder來建造產品 CBuilder *b1 = new CConcreteBuilder1(); CBuilder *b2 = new CConcreteBuilder2(); director->vConstruct(b1); CProduct *p1 = b1->cGetResult(); p1->vShow(); director->vConstruct(b2); CProduct *p2 = b2->cGetResult(); p2->vShow(); delete(b1); b1 = NULL; delete(b2); b2 = NULL; //------------------畫小人兒之建造者模式類測試------------------- // 畫一個瘦小人兒 CPersonThinBuilder *thin = new CPersonThinBuilder(); CPersonDirector *cpdt = new CPersonDirector( thin ); cpdt->vCreatePerson(); delete(thin); thin = NULL; delete(cpdt); cpdt = NULL; // 畫一個胖小人兒 CPersonFatBuilder *fat = new CPersonFatBuilder(); CPersonDirector *cpdf = new CPersonDirector( fat ); cpdf->vCreatePerson(); delete(fat); fat = NULL; delete(cpdf); cpdf = NULL; } /************************************************************************ * 小結: * 1、建造者模式主要用於創建一些複雜的對象,這些對象間的建造順序通 * 常是穩定的,但對象內部的構建通常面臨着複雜的變化。 * 2、建造者模式的好處在於使得建造代碼與表示代碼分離,由於建造者隱 * 藏了該產品是如何組裝的,所以若需要改變一個產品內部表示,只需 * 要再定義一個具體的建造者就可以了。 * 3、建造者模式是在當創建複雜對象的算法應該獨立於該對象的組成部分 * 以及它們的裝配方式時適用的模式。 ************************************************************************/
#pragma once /********************************************** * 建造者模式原理:[生成器模式] * 將一個複雜對象的構建與它的表示分離,使 * 得同樣的構建過程可以創建不同的表示。 * 如果我們使用了創造者模式,那麼用戶就只 * 需要建造的類型就可以得到它們,而具體建造 * 的過程和細節就不需要知道了。 ***********************************************/ #include <iostream> #include <string> #include <vector> using namespace std; //--------------------------------------------- // 具體產品類 // 一個產品由多個部件組成。 class CProduct { public: // 添加產品部件 void vAdd( string strpart ) { mv_strpart.push_back( strpart ); } // 列舉產品所有部件 void vShow() { cout << "/n產品 創建-->" << endl; vector<string>::iterator sit; for ( sit = mv_strpart.begin(); sit != mv_strpart.end(); ++sit ) { cout << "部件:" << *sit << endl; } } protected: private: vector<string> mv_strpart; }; //--------------------------------------------- // 抽象建造者類 // 爲創建一個CProduct對象的各個部件指定的 // 抽象接口。 class CBuilder { public: virtual void vBuildPartA(){}; virtual void vBuildPartB(){}; virtual CProduct *cGetResult(){return NULL;}; protected: private: }; //--------------------------------------------- // 具體建造者類 // 實現CBuilder接口,構造和裝配各個部件。 class CConcreteBuilder1 : public CBuilder { public: // 構造、析構 CConcreteBuilder1() : mp_prod(new CProduct()) {}; ~CConcreteBuilder1() { if ( NULL != mp_prod ) { delete(mp_prod); mp_prod = NULL; } } void vBuildPartA() { mp_prod->vAdd( "部件A" ); } void vBuildPartB() { mp_prod->vAdd( "部件B" ); } CProduct *cGetResult() { return mp_prod; } protected: private: CProduct *mp_prod; }; // 同上 class CConcreteBuilder2 : public CBuilder { public: // 構造、析構 CConcreteBuilder2() : mp_prod(new CProduct()) {}; ~CConcreteBuilder2() { if ( NULL != mp_prod ) { delete(mp_prod); mp_prod = NULL; } } void vBuildPartA() { mp_prod->vAdd( "部件X" ); } void vBuildPartB() { mp_prod->vAdd( "部件Y" ); } CProduct *cGetResult() { return mp_prod; } protected: private: CProduct *mp_prod; }; //--------------------------------------------- // 指揮者類 // 構建一個使用CBuilder接口的對象。 class CDirector { public: void vConstruct( CBuilder* pbuilder ) { pbuilder->vBuildPartA(); pbuilder->vBuildPartB(); } protected: private: };
#pragma once /********************************************** * * 建造者模式應用:畫個小人兒 * ***********************************************/ #include <iostream> using namespace std; // 建造者類 class CPersonBuilder { public: virtual void vBuilderHead(){};// 頭部 virtual void vBuilderBody(){};// 身體 virtual void vBuilderArmL(){};// 左手 virtual void vBuilderArmR(){};// 右手 virtual void vBuilderLegL(){};// 左腳 virtual void vBuilderLegR(){};// 右腳 protected: private: }; // 畫一個瘦的小人 class CPersonThinBuilder : public CPersonBuilder { public: void vBuilderHead()// 頭部 { cout << "瘦小的頭部!" << endl; } void vBuilderBody()// 身體 { cout << "瘦小的身體!" << endl; } void vBuilderArmL()// 左手 { cout << "瘦小的左手!" << endl; } void vBuilderArmR()// 右手 { cout << "瘦小的右手!" << endl; } void vBuilderLegL()// 左腳 { cout << "瘦小的左腳!" << endl; } void vBuilderLegR()// 右腳 { cout << "瘦小的右腳!" << endl; } protected: private: }; // 畫一個肥胖的小人 class CPersonFatBuilder : public CPersonBuilder { public: void vBuilderHead()// 頭部 { cout << "肥胖的頭部!" << endl; } void vBuilderBody()// 身體 { cout << "肥胖的身體!" << endl; } void vBuilderArmL()// 左手 { cout << "肥胖的左手!" << endl; } void vBuilderArmR()// 右手 { cout << "肥胖的右手!" << endl; } void vBuilderLegL()// 左腳 { cout << "肥胖的左腳!" << endl; } void vBuilderLegR()// 右腳 { cout << "肥胖的右腳!" << endl; } protected: private: }; // 指揮者類 class CPersonDirector { public: // 告訴指揮者,我要創建什麼樣的小人 CPersonDirector( CPersonBuilder *pb ) : mp_pb(pb) {}; // 根據用戶的選擇建造小人 void vCreatePerson() { mp_pb->vBuilderHead(); mp_pb->vBuilderBody(); mp_pb->vBuilderArmL(); mp_pb->vBuilderArmR(); mp_pb->vBuilderLegL(); mp_pb->vBuilderLegR(); } protected: private: CPersonBuilder *mp_pb; };
文章目錄一、逆向工程與正向工程在UML圖中的應用1. UML建模工具:2. UML工具 PowerDesigin 16.5 安裝:3. 名稱解釋:4. 操作流程二、關係(依賴,泛化,關聯,實現)畫法1. 依賴關係(Dependen
UML建模在工程開發中,不止程序員可以用於做軟件程序設計,而且產品經理也常常使用它來做軟件需求分析。它本身的語法複雜度不高,新手經過一段時間的系統練習,很快可以熟悉使用。當軟件需求者和軟件開發者共同遵循這一套標準時,無疑可以大
/************************************************************************ * 命令模式學習筆記[C++] * Author: 陳相禮 * Time: 200
/************************************************************************ * 橋接模式學習筆記[C++] * Author: 陳相禮 * Time: 200
/************************************************************************ * 模板方法模式學習筆記[C++] * Author: 陳相禮 * Time: 2
/************************************************************************ * 類的設計:單一職責原則 * 1、就一個類而言,應該僅有一個引起它變化的原因。 *
/************************************************************************ * 工廠方法模式學習筆記[C++] * Author: 陳相禮 * Time: 2
/************************************************************************ * 代理模式學習筆記[C++] * Author: 陳相禮 * Time: 200
一、繼承關係 繼承指的是一個類(稱爲子類、子接口)繼承另外的一個類(稱爲父類、父接口)的功能,並可以增加它自己的新功能的能力。在Java中繼承關係通過關鍵字extends明確標識,在設計時一般沒有爭議性。在UML類圖設計中,繼承