個人在看書總結,覺得模板方法和建造者模式極為相似:
兩字引出例子分別為:招聘流程(面對招聘公司、地點、物件不同,可變化)、**畫小人(高手矮胖等),兩者都是極為注重流程,卻不依賴細節。主要表現,依賴倒置原則:面向介面程式設計,依賴於抽象而不依賴於具體。寫**時用到具體類時,不與具體類互動,而與具體類的上層接**互。
區別:雖然兩者都強調流程,但是模板方法,是行為模式,建造者是建立型。這點需要根據模組的使用特性來確定。
原型模式(複製簡歷與手寫簡歷)屬於建立型模式(注重物件建立)。
模板方法(考試答題、招聘流程)屬於行為模式(注重流程)。
當我們要完成在某一細節層次一致的乙個過程或一系列步驟(如招聘流程,開會流程--但具體招聘的公司時間地點物件都不盡相同),但其個別步驟在更詳細的層次上實現可能不同時,通常考慮模板方法。
模板方法模式是一種**復用技術,在類庫設計中尤為重要,
它提取了類庫中的公共行為,將公共行為放在父類中,而通過其子類來實現不同的行為,它鼓勵我們恰當使用繼承來實現**復用
。可實現一種反向控制結構,通過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執行。
在模板方法模式中,可以通過子類來覆蓋父類的基本方法,不同的子類可以提供基本方法的不同實現,更換和增加新的子類很方便,符合單一職責原則和開閉原則。
如果父類中可變的基本方法太多,將會導致類的個數增加,系統更加龐大,設計也更加抽象,此時,可結合橋接模式來進行設計。
引用乙個別人招聘的例子:
// abstract_class.h
#ifndef abstract_class_h
#define abstract_class_h
#include // 公司
class company
// 校園招聘
void recruit()
// 宣講會
void careertalk()
// 接收簡歷
void receiveresume()
// 面試
virtual void interview() = 0;
// 發放 offer
virtual void offer() = 0;
};#endif // abstract_class_h
// concrete_class.h
#ifndef concrete_class_h
#define concrete_class_h
#include "abstract_class.h"
#include // 阿里
class alibaba : public company
virtual void offer() override
};class tencent : public company
virtual void offer() override
};#endif // concrete_class_h
// main.cpp
#include "concrete_class.h"
#ifndef safe_delete
#define safe_delete(p) }
#endif
int main()
輸出:
———- begin ———-
delivery
receive resume
first interview -> second interview -> third interview
30w
———- end ———-
———- begin ———-
delivery
receive resume
first interview -> second interview
25w
———- end ———-
設計模式學習 七 建造者模式
將乙個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式。include using namespace std class product void setpartb int y void setpartc int z private int a,b,...
設計模式學習(七)建造者模式
建造者模式 builder pattern 使用多個簡單的物件一步一步構建成乙個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。該類圖還是沿用咱們之前的車的場景來做說明,從圖中可以看出,建造者模式很像是抽象模式的拓展。首先我們先建立了乙個抽象方法,抽象方法裡包含了sta...
設計模式之模板模式和建造者模式
一 說明 我覺得模板模式真的沒有什麼東西,似乎只是簡單的利用了繼承,而且和建造者模式差不多。二 模板模式定義 定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中,是的子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。例子 比如製造乙個產品x,需要先製作零件a,然後零件b,然後零件c...