1 介绍
Builder模式是一种对象创建型模式。主要用来隐藏复合对象的创建过程,复合对象的创建抽象出来,通过子类继承或重载的方式,动态的创建复合对象。
建造者模式的几个角色
- Builder:抽象建造者 --- Product中各个复合对象的接口
- ConcreateBuidler:具体建造者 --- 实现抽象接口并加以实现
- Director:指挥者
- Product:产品角色 --- 一个具体的产品对象
先举个例子来理解下几个角色的意思:
<a>当我们去吃kfc时,我们需要先告诉服务员(Director
)我们需要点什么套餐(ConcreateBuilder
),然后厨房(Builder
)再根据套餐去选择合适的单品(Product
)。</a>
2 实现
产品角色: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--生产食物");
}
@Override
public void makeDrink() {
meal.setDrink("套餐A--生产饮料");
}
@Override
public Meal getMeal() {
return meal;
}
}
public class MealB implements Kitchen{
Meal meal = new Meal();
@Override
public void makeFood() {
meal.setFood("套餐B--生产食物");
}
@Override
public void makeDrink() {
meal.setDrink("套餐B--生产饮料");
}
@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;
}
}
测试: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());
}
}
3 优缺点
优点:
- 将产品的创建过程与产品本身分离出来,可以根据相同的创建过程得到不同的产品。
- 将复杂的产品创建过程进行分解,让整个创建过程增次化,这样可以让开发人员更加方便的进行操控。
缺点
- 如果产品的的内部结构很复杂,可能会导致需要定义很多的具体建造者来实现这些变化,导致代码量过多。