创建型设计模式----建造者模式

简介

建造者模式:将一个复杂对象的构建和表示分离,使得同样的构造过程可以创建不同的表示。

说明:对象构建型模式就是一步步创建一个复杂的对象,用户只需要指定一个复杂对象的类型就可以构建它们,不需要知道具体的内部细节。比如汽车,用户只需要指定汽车的类型(如面包车)就可以得到了,不需要知道车的轮子,发动机这些是怎么制造安装的。

模式结构

在这里插入图片描述
说明一下具体成分:
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、对象得创建过程独立于创建该对象得类。在例子中体现得就是套餐的产生和谁买套餐是独立得。

比如:游戏中人物的创建就可以适用建造者模式,因为不同人物具有相同的服饰、装备栏等属性。

那么本期建造者模式到这里结束啦,欢迎大家留言讨论~~

猜你喜欢

转载自blog.csdn.net/machine_Heaven/article/details/104985476