1 介紹
Builder模式是一種對(duì)象創(chuàng)建型模式。主要用來隱藏復(fù)合對(duì)象的創(chuàng)建過程竟痰,復(fù)合對(duì)象的創(chuàng)建抽象出來签钩,通過子類繼承或重載的方式,動(dòng)態(tài)的創(chuàng)建復(fù)合對(duì)象坏快。
建造者模式的幾個(gè)角色
- Builder:抽象建造者 --- Product中各個(gè)復(fù)合對(duì)象的接口
- ConcreateBuidler:具體建造者 --- 實(shí)現(xiàn)抽象接口并加以實(shí)現(xiàn)
- Director:指揮者
- Product:產(chǎn)品角色 --- 一個(gè)具體的產(chǎn)品對(duì)象
先舉個(gè)例子來理解下幾個(gè)角色的意思:
<a>當(dāng)我們?nèi)コ詋fc時(shí)边臼,我們需要先告訴服務(wù)員(Director
)我們需要點(diǎn)什么套餐(ConcreateBuilder
),然后廚房(Builder
)再根據(jù)套餐去選擇合適的單品(Product
)假消。</a>
2 實(shí)現(xiàn)
產(chǎn)品角色:Product.class
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;
}
@Override
public String toString() {
return "Meal [food=" + food + ", drink=" + drink + "]";
}
}
抽象建造者:Kitchen.class
public interface Kitchen {
void makeFood();
void makeDrink();
Meal getMeal();
}
具體建造者:MealA.class/MealB.class
public class MealA implements Kitchen{
Meal meal = new Meal();
@Override
public void makeFood() {
meal.setFood("套餐A--生產(chǎn)食物");
}
@Override
public void makeDrink() {
meal.setDrink("套餐A--生產(chǎn)飲料");
}
@Override
public Meal getMeal() {
return meal;
}
}
public class MealB implements Kitchen{
Meal meal = new Meal();
@Override
public void makeFood() {
meal.setFood("套餐B--生產(chǎn)食物");
}
@Override
public void makeDrink() {
meal.setDrink("套餐B--生產(chǎn)飲料");
}
@Override
public Meal getMeal() {
return meal;
}
}
指揮者:Waiter.class
public class Waiter {
private Kitchen kitchen;
public Waiter (Kitchen kitchen) {
this.kitchen = kitchen;
}
public Kitchen getMeal(){
kitchen.makeFood();
kitchen.makeDrink();
return kitchen;
}
}
測(cè)試:MainClass.class
public class MainClass {
public static void main(String[] args) {
Kitchen meal = new MealA();
Waiter waiter = new Waiter(meal);
waiter.getMeal();
Meal meal2 = meal.getMeal();
System.out.println(meal2.toString());
}
}
運(yùn)行結(jié)果
3 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 將產(chǎn)品的創(chuàng)建過程與產(chǎn)品本身分離出來柠并,可以根據(jù)相同的創(chuàng)建過程得到不同的產(chǎn)品。
- 將復(fù)雜的產(chǎn)品創(chuàng)建過程進(jìn)行分解富拗,讓整個(gè)創(chuàng)建過程增次化臼予,這樣可以讓開發(fā)人員更加方便的進(jìn)行操控。
缺點(diǎn)
- 如果產(chǎn)品的的內(nèi)部結(jié)構(gòu)很復(fù)雜啃沪,可能會(huì)導(dǎo)致需要定義很多的具體建造者來實(shí)現(xiàn)這些變化粘拾,導(dǎo)致代碼量過多。