今天要介紹的是建構者模式(Builder),可能很多人,包括我都會把這個跟工廠模式搞混,所以我最後會稍微說明兩者的差異。
創建類別的時候,我們也會有建構子,如果我們創建物件的種類太多,例如以日期顯示的類別來說,可以分成只顯示月份、日期,或是年份、月份、日期,年份又分西元和民國,這樣會造成我們有太多的建構子,而且只要有新的格式,就要去修改程式碼,會讓程式維護不易。
class Date{
public:
Date(int year, int month, int date);
Date(int year, int month);
Date(int month, int date);
.
.
.
}
這時我們可以使用建構者模式,建構者模式的重點在物件產生的過程,我們要把物件產生的每個步驟都變成一個 Builder,上面的例子就可以分成年份的 Builder、月份的 Builder 還有日期的 Builder,在創建物件時就可以決定要設定哪幾個,就不用寫這麼多的建構子,如果你的程式需要跟別人共筆,就不會讓別人有看不完的使用方式。
class DateBuilder{
public:
DateBuilder setYear(int year);
DateBuilder setMonth(int month);
DateBuilder setDate(int date);
}
class ViewAllDateBuilder : DateBuilder{
public:
DateBuilder setYear(int year){
_year = year;
}
DateBuilder setMonth(int month){
_month = month;
}
DateBuilder setDate(int date){
_date = date;
}
Date create(){
return Date(_year, _month, _date);
}
}
使用方式如下。
DateBuilder builder = new ViewAllDateBuilder();
builder.setYear(2019);
builder.setMonth(10);
builder.setDate(2);
Date date = builder.create();
這樣就可以完成日期的設定。
最後大概講一下建構者跟工廠模式的差異。
建構者模式的重點是要封裝複雜的步驟,不論過程做了什麼,最後只回傳一種東西。工廠模式則是維護一些相關的產品,產出某類別的多項產品。
參考資料:
http://rockssdlog.blogspot.com/2012/05/design-pattern-builder-pattern.html
http://corrupt003-design-pattern.blogspot.com/2017/01/builder-pattern.html