建造者模式
一、模式動機
建造者模式(Builder Pattern)是最復(fù)雜的創(chuàng)建型模式,它用于創(chuàng)建一個包含多個組成部分的復(fù)雜對象,可以返回一個完整的產(chǎn)品對象給用戶。它通過將客戶端與包含多個組成部分的復(fù)雜對象的創(chuàng)建過程分離,使得客戶端無需知道復(fù)雜對象的內(nèi)部組成部分與裝配方式,只需要知道建造者的類型即可。它關(guān)注如何一步一步創(chuàng)建一個復(fù)雜對象,不同的具體建造者定義了不同的創(chuàng)建過程,且具體建造者相互獨立,增加新的建造者非常方便,系統(tǒng)具有較好的擴展性。
二、模式定義
- 建造者模式(Builder Pattern):將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
- 建造者模式是一步一步創(chuàng)建一個復(fù)雜的對象,它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。建造者模式屬于對象創(chuàng)建型模式。
三、模式結(jié)構(gòu)
產(chǎn)品:一個由多種組件組合生成的復(fù)雜對象
public class Product {
private String partA; //定義部件,部件可以是任意類型,包括值類型和引用類型
private String partB;
private String partC;
//partA的Getter方法和Setter方法省略
//partB的Getter方法和Setter方法省略
//partC的Getter方法和Setter方法省略
}
抽象建造者
public abstract class Builder {
//創(chuàng)建產(chǎn)品對象
protected Product product=new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回產(chǎn)品對象
public Product getResult() {
return product;
}
}
具體建造者
public class ConcreteBuilder1 extends Builder{
public void buildPartA() {
product.setPartA("A1");
}
public void buildPartB() {
product.setPartB("B1");
}
public void buildPartC() {
product.setPartC("C1");
}
}
指揮者
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder=builder;
}
public void setBuilder(Builder builder) {
this.builder=builer;
}
//產(chǎn)品構(gòu)建與組裝方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
客戶
......
Builder builder = new ConcreteBuilder1(); //可通過配置文件實現(xiàn)
Director director = new Director(builder);
Product product = director.construct();
......
四、案例實現(xiàn)
案例背景
每一份套餐都是由不同的food和drink組成
案例結(jié)構(gòu)
代碼實現(xiàn)
Meal
public class Meal {
private String food;
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
MealBuilder
public abstract class MealBuilder {
protected Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal() {
return meal;
}
}
具體建造者A
public class MealBuilderA extends MealBuilder{
@Override
public void buildFood() {
this.meal.setFood("AFood");
}
@Override
public void buildDrink() {
this.meal.setDrink("ADrink");
}
}
具體建造者B
public class MealBuilderB extends MealBuilder{
@Override
public void buildFood() {
this.meal.setFood("BFood");
}
@Override
public void buildDrink() {
this.meal.setDrink("BDrink");
}
}
指揮者類
public class Director {
private MealBuilder mb;
public void setMb(MealBuilder mb) {
this.mb = mb;
}
public Meal construct(){
mb.buildFood();
mb.buildDrink();
return mb.getMeal();
}
}
客戶類文章來源:http://www.zghlxwxcb.cn/news/detail-437836.html
public class Client {
public static void main(String[] args) {
MealBuilderA mbA = new MealBuilderA();//選擇套餐
Director director = new Director();//叫服務(wù)員
director.setMb(mbA);//告知服務(wù)員
Meal meal = director.construct();//服務(wù)員上套餐
System.out.println("套餐A:");
System.out.println(meal.getFood());
System.out.println(meal.getDrink());
}
}
五、模式分析
在一個復(fù)雜對象由很多復(fù)雜的屬性組成,不同的屬性組成不同的復(fù)雜對象,建造者使用setter注入不同的屬性,指揮者包含建造者,在指揮者內(nèi)調(diào)用建造者方法獲取復(fù)雜對象文章來源地址http://www.zghlxwxcb.cn/news/detail-437836.html
六、總結(jié)
模式優(yōu)點
- 客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象
- 每一個具體建造者都相對獨立,與其他的具體建造者無關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者,擴展方便,符合開閉原則
- 可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程
模式缺點
- 建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似,如果產(chǎn)品之間的差異性很大,不適合使用建造者模式,因此其使用范圍受到一定的限制
- 如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會需要定義很多具體建造者類來實現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大,增加了系統(tǒng)的理解難度和運行成本
使用情形
簡化
- 省略抽象建造者角色-(系統(tǒng)中只需要1個建造者時)
- 省略指揮者角色-(系統(tǒng)中只需要1個建造者是,省略抽象建造者、還可繼續(xù)省略指揮者,讓Builder角色扮演指揮者與建造者雙重角色
到了這里,關(guān)于建造者模式(Builder Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!