網上關於builder模式的blog很多。這裡不再細說。這裡只是總結一下我對這種設計模式的理解。
builder和factory是builder設計模式的兩個部分。這裡說是builder&factory,並非標新立異,只為記憶方便,所以就不要吐槽了。
一、builder子類的功能是什麼?
提供部件的構造過程(部件水平),包括如何將部件裝配成產品的一部分(產品一般會提供乙個add***的方法)
二、builder子類之間的差異?
builder子類選擇性實現builder的介面,所以差異就在於實現介面的演算法不同,也就是構造部件的演算法、裝配方式不同。
三、何時增加乙個新的builder子類?
明白了上乙個問題,這個問題就迎刃而解了。當我們需要對不同的部件用不同的演算法去構造或不同的方式去轉配成產品時,我們就需要增加乙個新的builder子類。
幾點說明:
1、builder基類提供的介面一般不是純虛函式(builder子類可自由選擇對哪個部件的操作進行重寫)
2、生成產品的過程類似於搭積木。builder提供積木,directory將積木按不同演算法組合形成最終的產品
測試**。產品是包含大學生4年成績的undergraduate。
student.h
#ifndef _student_h_
#define _student_h_
#define max_student 4
class student
;protected:
student(int g = 0);
private:
int grade;
};//graduate
class graduate
;//freshman
class freshman :
public student
;private:
int grade;
};//sophomore
class sophomore :
public student
;private:
int grade;
};//junior
class junior :
public student
;private:
int grade;
};//senior
class senior :
public student
;private:
int grade;
};#endif
student.cpp
#include "student.h"
#include student::student(int g)
student::~student()
//graduate
graduate::graduate()
}void graduate::showall()
graduate::~graduate()
void graduate::addstudent(student * student)
}//freshman
freshman::freshman(int g)
freshman::~freshman()
//sophomore
sophomore::sophomore(int g)
sophomore::~sophomore()
//junior
junior::junior(int g)
junior::~junior()
//senior
senior::senior(int g)
senior::~senior()
builder.h
#ifndef _builder_h_
#define _builder_h_
class graduate;
class builder
; virtual void buildfreshman(int grade);
virtual void buildsophomore(int grade);
virtual void buildjunior(int grade);
virtual void buildsenior(int grade);
virtual graduate * getgraduate();
protected:
builder();
};class undergraduatebuilder :
public builder
;private:
graduate * m_graduate;
};#endif
builder.cpp
#include "builder.h"
#include "student.h"
builder::builder()
builder::~builder()
void builder::buildfreshman(int grade)
void builder::buildsophomore(int grade)
void builder::buildjunior(int grade)
void builder::buildsenior(int grade)
//undergraduatebuilder
undergraduatebuilder::undergraduatebuilder()
undergraduatebuilder::~undergraduatebuilder()
void undergraduatebuilder::buildgraduate()
void undergraduatebuilder::buildfreshman(int grade)
void undergraduatebuilder::buildsophomore(int grade)
void undergraduatebuilder::buildjunior(int grade)
void undergraduatebuilder::buildsenior(int grade)
director.h
#ifndef _director_h_
#define _director_h_
class builder;
class graduate;
class director
;#endif
director.cpp
#include "director.h"
#include "builder.h"
#include "student.h"
director::director(builder *mybuilder)
director::~director()
//構造graduate
//builder提供了一系列元件的構造介面,director選用介面構造產品
graduate * director::construct(int grade1, int grade2, int grade3, int grade4)
main.cpp
#include #include #include "builder.h"
#include "director.h"
#include "student.h"
int main()
結果
android layout weight設定解讀
參考文章 android layout weight的真實含義是 一旦view設定了該屬性 假設有效的情況下 那麼該 view的寬度等於原有寬度 android layout width 加上其在剩餘空間中的佔比!設螢幕寬度為l,在兩個view的寬度都為match parent的情況下,原有寬度為l...
Android RecyclerView設定空布局
1 自定義乙個emptyrecyclerview繼承recyclerview 2 採用adapterdataobserver觀察者模式來監聽資料的變化,如果有資料就隱藏空布局,反之,則顯示。view memptyview private adapterdataobserver emptyobserv...
Capacity Scheduler 佇列設定
先附乙個官網位址 capacity scheduler是yarn中預設的資源排程器。資源分配相關引數 1 capacity 佇列的資源容量 百分比 當系統非常繁忙時,應保證每個佇列的容量得到滿足,而如果每個佇列應用程式較少,可將剩餘資源共享給其他佇列。注意,所有佇列的容量之和應小於100。2 max...