简介
建造者模式:将一个复杂对象的构建和表示分离,使得同样的构造过程可以创建不同的表示。
说明:对象构建型模式就是一步步创建一个复杂的对象,用户只需要指定一个复杂对象的类型就可以构建它们,不需要知道具体的内部细节。比如汽车,用户只需要指定汽车的类型(如面包车)就可以得到了,不需要知道车的轮子,发动机这些是怎么制造安装的。
模式结构
说明一下具体成分:
Builder:抽象构造者为创建一个产品对象各个组件指定抽象接口
ConcreteBuilder:具体构造者实现抽象构造接口,实现各个部件的构造和装配方法,定义并明确它所构建的对象
Director:指挥者负责安排复杂对象的构建次序,与抽象构造者之间是关联关系,可以在其construct方法中安排构造者对象的部件构造和装配方法,完成复杂对象的构建。
Product:产品对象,即要被构造的复杂对象,包含多个部件。
举个栗子
以肯德基的套餐为例子吧。那么product就是套餐的食物,包括吃的、喝的;构造者就是套餐咯,吃的放汉堡或鸡肉卷,喝的是可乐或咖啡,实现食物的装配;指挥者就是帮你下单的服务员啦。
结构图:
下面上新鲜的代码:
首先是产品对象:
public class Meal {
private String food;
private String drink;
------getter和setter-----
}
抽象构造者:
public abstract class MealBuilder {
protected Meal meal;
{
meal = new Meal();
}
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal() {
return meal;
}
}
具体构造者:
public class SubMealBuilderA extends MealBuilder {
@Override
public void buildFood() {
meal.setFood("一个鸡肉卷");
}
@Override
public void buildDrink() {
meal.setDrink("一杯可乐");
}
}
class SubMealBuilderB extends MealBuilder {
@Override
public void buildFood() {
meal.setFood("一个汉堡");
}
@Override
public void buildDrink() {
meal.setDrink("一杯咖啡");
}
}
指挥者:
public class KFCWaiter {
MealBuilder builder ;
public void setBuilder(MealBuilder builder) {
this.builder = builder;
}
public Meal construct() {
builder.buildFood();
builder.buildDrink();
return builder.getMeal();
}
}
测试:
public class Test {
public static void main(String[] args) {
MealBuilder mb = new SubMealBuilderB();
KFCWaiter waiter = new KFCWaiter();
waiter.setBuilder(mb);
Meal meal = waiter.construct();
System.out.println("套餐组成:");
System.out.println(meal.getFood());
System.out.println(meal.getDrink());
}
}
优缺点
优点:用户不需要知道产品内部的组成细节,将产品本身和产品的创建解耦,使得相同的构造过程可以产生不一样的产品对象。
缺点:如果产品差异较大,且内部的变化复杂,使用构造者模式会变得非常庞大。
适用场景
1、对象有很复杂得内部结构,而且内部结构互相依赖,需要指定生成顺序
2、对象得创建过程独立于创建该对象得类。在例子中体现得就是套餐的产生和谁买套餐是独立得。
比如:游戏中人物的创建就可以适用建造者模式,因为不同人物具有相同的服饰、装备栏等属性。
那么本期建造者模式到这里结束啦,欢迎大家留言讨论~~