设计模式-生成器模式

1.定义

封装一个产品的构造过程,并允许按步骤构造

2.使用场景及设计

2.1.使用场景

需要经过多个步骤创建的对象,如实际生活中的点餐流程,管理系统中的导出框架等

2.2.简略流程图

此处以点餐流程为例在这里插入图片描述

3.测试代码

3.1.类图

在这里插入图片描述

3.2.测试代码

入口代码

package com.glt.designpattern.builder;

public class InitMain {

    public static void main(String[] args) {
    
        Builder builder = new Builder();

        Meal breakfast = builder.breakfast();
        breakfast.takeOrder();
        System.out.println();
        Meal lunch = builder.lunch();
        lunch.takeOrder();
        System.out.println();
        Meal dinner = builder.dinner();
        dinner.takeOrder();
        System.out.println();
    }
}

建造者类

package com.glt.designpattern.builder;

/**
 * 建造者对象
 * 生成最终对象的建造者
 */
public class Builder {
    /**
     * 早餐
     */
    public Meal breakfast(){
        Meal meal = new Meal();
        meal.addItem(new BreadFood());
        meal.addItem(new WaterDrink());
        return meal;
    }

    /**
     * 午餐
     */
    public Meal lunch(){
        Meal meal = new Meal();
        meal.addItem(new PizzaFood());
        meal.addItem(new BeerDrink());
        return meal;
    }

    /**
     * 晚餐
     */
    public Meal dinner(){
        Meal meal = new Meal();
        meal.addItem(new BreadFood());
        meal.addItem(new BeerDrink());
        return meal;
    }
}

建造者产品类

package com.glt.designpattern.builder;

/**
 * 建造者对象
 * 生成最终对象的建造者
 */
public class Builder {
    /**
     * 早餐
     */
    public Meal breakfast(){
        Meal meal = new Meal();
        meal.addItem(new BreadFood());
        meal.addItem(new WaterDrink());
        return meal;
    }

    /**
     * 午餐
     */
    public Meal lunch(){
        Meal meal = new Meal();
        meal.addItem(new PizzaFood());
        meal.addItem(new BeerDrink());
        return meal;
    }

    /**
     * 晚餐
     */
    public Meal dinner(){
        Meal meal = new Meal();
        meal.addItem(new BreadFood());
        meal.addItem(new BeerDrink());
        return meal;
    }
}

子项接口

package com.glt.designpattern.builder;

/**
 * 每一餐需要的子项
 */
public interface Item {

    public String name();

    public float price();

    public String packing();
}

食品对象

package com.glt.designpattern.builder;

/**
 * 食品项
 */
public abstract class Food implements Item{

    @Override
    public String packing() {
        return "盒子";
    }
}

饮品对象

package com.glt.designpattern.builder;

/**
 * 饮品项
 */
public abstract class Drink implements Item {
    @Override
    public String packing() {
        return "瓶子";
    }
}

具体食品类

package com.glt.designpattern.builder;

/**
 * 食品类-面包
 */
public class BreadFood extends Food {
    @Override
    public String name() {
        return "面包";
    }

    @Override
    public float price() {
        return 3;
    }
}

package com.glt.designpattern.builder;

/**
 * 食品类-披萨
 */
public class PizzaFood extends Food {
    @Override
    public String name() {
        return "披萨";
    }

    @Override
    public float price() {
        return 5;
    }
}

具体饮品类

package com.glt.designpattern.builder;

/**
 * 饮品类-啤酒
 */
public class BeerDrink extends Drink {
    @Override
    public String name() {
        return "啤酒";
    }

    @Override
    public float price() {
        return 3;
    }
}

package com.glt.designpattern.builder;

/**
 * 饮品类-水
 */
public class WaterDrink extends Drink {
    @Override
    public String name() {
        return "水";
    }

    @Override
    public float price() {
        return 1;
    }
}

输出结果:

名称:面包,水
价格:4.0
包装:盒子,瓶子


名称:披萨,啤酒
价格:8.0
包装:盒子,瓶子


名称:面包,啤酒
价格:6.0
包装:盒子,瓶子


Process finished with exit code 0

4.总结

优点:

建造者在产品的每个步骤都可以自由组合,扩展性强

缺点:

内部步骤变化复杂,会产生很多类
与工厂模式区别是此模式会有多个步骤,并且会关注每个步骤的顺序

发布了61 篇原创文章 · 获赞 85 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/bluuusea/article/details/87992592