Java设计模式|建造者模式Builder Pattern

355 阅读3分钟

这是我参与更文挑战的第21天,活动详情查看: 更文挑战

前言:

在日常生活中,我们可能会遇到这一类型的需求,例如一个实体类里有很多个属性,但是我们只想要其中的几种组合成一个新的对象,这个时候就可以使用建造者模式了,它提供了一种创建对象的最佳方式。建造者模式虽然比较好用,但是大家平时写代码的时候要谨记,不要滥用设计模式,不然的话可能会适得其反啊!

建造者模式

介绍:建造者模式又被称呼为生成器模式,这种类型的设计模式属于创建型模式,使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

作用: 建造者模式主要用于解决软件系统中复杂对象的创建问题。例如复杂对象的创建通过各个部分的子对象用一定的算法构成,在需求变化时复杂对象面临大的改变,不利于系统的稳定,使用建造者将各个部分的算法包装起来,需求变化只需要将算法的顺序以及组合方式改变即可。

解释: 我们可以这样理解一下:有一个特别好的例子,例如我们在麦当劳点餐有如下几个可点的东西

  1. 香辣鸡腿堡,奥尔良鸡腿堡,安格斯牛堡
  2. 可乐,橙汁,咖啡
  3. 薯条,鸡块,鸡腿
  4. 香辣鸡腿堡+可乐+薯条 =A套餐
  5. 奥尔良鸡腿堡+可乐+薯条 =B套餐
  6. 安格斯牛堡+可乐+薯条 =C套餐
  7. ...... 看上边的条件,我们在转换成Java代码进行编码的时候得写3 * 3 * 3=27个实体类来进行表示每一个实体类,这就很不友好了,这个时候就可以使用建造者模式来优化上面的这种情况;

图片.png

代码实现:

第一步:定义Product

/**
 * 一个具体的产品对象,实体
 */
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;
    }
}

第二步:定义Builder(抽象建造者): 创建一个Product对象的各个部件指定的抽象接口

/**
 * 抽象建造者
 */
public abstract class MealBuilder {

    Meal meal = new Meal();

    public abstract void buildFood();

    public abstract void buildDrink();

    public Meal getMeal(){
        return meal;
    }
}

第三步,定义ConcreteBuilder(具体建造者): 实现抽象接口,构建和装配各个部件。

/**
 * 具体建造者:A套餐
 */
public class MealA extends MealBuilder{
    public void buildDrink() {
        meal.setDrink("可乐");
    }

    public void buildFood() {
        meal.setFood("薯条");
    }
}

/**
 * 具体建造者:B套餐
 */
public class MealB extends MealBuilder{
    public void buildDrink() {
        meal.setDrink("柠檬果汁");
    }

    public void buildFood() {
        meal.setFood("鸡翅");
    }
}

第四步,定义Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

/**
 * 指挥者:构建一个使用Builder接口的对象
 */
public class KFCServer {
    private MealBuilder mealBuilder;

    public KFCServer(MealBuilder mealBuilder) { //构造方法
        this.mealBuilder = mealBuilder;
    }

    public Meal construct(){
        //准备食物
        mealBuilder.buildFood();
        //准备饮料
        mealBuilder.buildDrink();

        //准备完毕,返回一个完整的套餐给客户
        return mealBuilder.getMeal();
    }
}

第五步,测试

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {

        MealA a = new MealA();//创建套餐A对象
        KFCServer waitera = new KFCServer(a);//准备套餐A的服务员
        Meal mealA = waitera.construct();//获得套餐A
        System.out.print("套餐A的组成部分:");
        System.out.println("食物:"+mealA.getFood()+";   "+"饮品:"+mealA.getDrink());

        MealB b = new MealB();
        KFCServer waiterb = new KFCServer(b);
        Meal mealB = waiterb.construct();
        System.out.print("套餐B的组成部分:");
        System.out.println("食物:"+mealB.getFood()+";   "+"饮品:"+mealB.getDrink());
    }
}

ok!今天的文章就到这了,希望可以对大家有帮助,有不对的地方希望大家可以提出来的,共同成长;

整洁成就卓越代码,细节之中只有天地