建造者模式
建造者模式(Builder):將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
建造者模式組成
抽象建造者(builder):爲創建一個產品對象的各個部件指定抽象接口。
實際建造者(ConcreteBuilder):實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口。
指導者(Director):構造一個使用Builder接口的對象。
產品角色(Product):表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
UML圖
個人理解
建造者定義很通俗易懂,就是將裝配的過程和成果展示分離,過程不變,但是我可以改變材料,出來不相同的作品。
這個過程就由抽象建造者定義
實際建造者就是通過定義好的過程添加不同的材料建造不一樣的產品,每個實際建造者都帶表了一種產品
指導者就是指揮讓哪一個實際建造者來製作
產品就不要說了,它定義了都有什麼部件
舉個例子
interface Builder{
//定義了創建流程,一共兩步
void buildUp();
void buildDown();
}
//二哈創建類,專門創建二哈用
class DogBuilder implements Builder{
private Animal product=new Animal();
@Override
public void buildUp() {
product.setUp("開始構建二哈上半部");
}
@Override
public void buildDown() {
product.setDown("開始構建二哈下半部");
}
public Animal getProduct(){
return product;
}
}
//同理專門創建加菲貓用
class CatBuilder implements Builder{
private Animal product=new Animal();
@Override
public void buildUp() {
product.setUp("開始構建加菲上半部");
}
@Override
public void buildDown() {
product.setDown("開始構建加菲下半部");
}
public Animal getProduct(){
return product;
}
}
//指導者,哪個實際創建者進來就創建哪個
class Director{
public void construct(Builder builder){
builder.buildUp();
builder.buildDown();
}
}
//產品類,我這裏是動物
class Animal{
//偷個懶簡單把動物分成上下兩部,定義了實際產品的部件
String Up;
String Down;
public String getUp() {
return Up;
}
public void setUp(String up) {
Up = up;
}
public String getDown() {
return Down;
}
public void setDown(String down) {
Down = down;
}
public void show(){
System.out.println(Up);
System.out.println(Down);
}
}
public class Client {
public static void main(String[] args) {
Director director=new Director();
//先來創建一隻狗
DogBuilder dogBuilder=new DogBuilder();
director.construct(dogBuilder);
Animal dog=dogBuilder.getProduct();
dog.show();
//再來一隻貓
CatBuilder catBuilder=new CatBuilder();
director.construct(catBuilder);
Animal cat=catBuilder.getProduct();
cat.show();
}
}
寫到這裏我突然發現建造者模式和工廠方法模式有點類似,因爲從增加新的產品方式來看,感覺用誰都差不多,不過查找一些資料後,來看:
工廠方法模式針對的是產品本身並不很複雜,而建造者模式針對的則是創建符合的產品,可以很複雜,模塊可以很多。
因此我覺得選哪個到時候還是要看實際的產品問題。