Builder的设计模式详解

在学习静态内部类的时候时候发现了这种设计模式,网上看了一些资料按照自己的理解写了出来。

1 什么是Builder设计模式

  • 复杂事物的构建和表示相分离,这句话是对建造者模式的总结,事物的构建过程是固定的,不同方式的实现,可以构建出不同对象,例如:一家餐馆推出3菜一汤套餐,菜品有多个,三菜一汤可以自己组合。
  • Builder设计模式分为经典模式和变种模式。
  • 设计构图
    在这里插入图片描述

2 Builder经典设计模式

  • 经典模式不经常使用,但是有助于对变种模式的理解;
    建立一个套餐类meals
package com.lizheng.Builder.ClassicBuild;

//设置一个套餐3菜一汤,可以根据不同的菜组成这个套餐
public class Meals {
    private String mealOne;//菜品一
    private String mealtwo;//菜品二
    private String mealthree;//菜品三
    private String soup;//汤

    //设置get和set方法

    public String getMealOne() {
        return mealOne;
    }

    public void setMealOne(String mealOne) {
        this.mealOne = mealOne;
    }

    public String getMealtwo() {
        return mealtwo;
    }

    public void setMealtwo(String mealtwo) {
        this.mealtwo = mealtwo;
    }

    public String getMealthree() {
        return mealthree;
    }

    public void setMealthree(String mealthree) {
        this.mealthree = mealthree;
    }

    public String getSoup() {
        return soup;
    }

    public void setSoup(String soup) {
        this.soup = soup;
    }
    //重写toString方法
    @Override
    public String toString(){

        String meals="菜品一是"+mealOne+"\n"+"菜品二是"+mealtwo+"\n"+"菜品三是"+mealthree+"\n"+"汤是"+soup;

        return meals;

    }
}

抽象出选菜的过程,接口MealsBuilder

//把三菜一汤的方法抽象出来
public interface MealsBuilder {
    //设置一个菜品一
    void setmealOne();

    //设置一个菜品二
    void setMealtwo();

    //设置一个菜品三
    void setMealthree();

    //设置一碗汤
    void setsoup();

    //获取三菜一汤的信息
    Meals getMeals();

}

选出一个A顾客的套餐

package com.lizheng.Builder.ClassicBuild;


//A套餐
public class MealsA implements MealsBuilder {
    private Meals mealas;

    public MealsA(){
        this.mealas=new Meals();

    }
    @Override
    public void setmealOne() {
        mealas.setMealOne("红烧肉");
    }

    @Override
    public void setMealtwo() {
        mealas.setMealtwo("烧白");
    }

    @Override
    public void setMealthree() {
        mealas.setMealthree("青椒肉丝");
    }
    @Override
    public void setsoup() {
        mealas.setSoup("平菇肉片汤");
    }

    @Override
    public Meals getMeals() {
        return mealas;
    }
}

由服务员把几种菜品组装

package com.lizheng.Builder.ClassicBuild;

public class Director {
    //声明MealsBuilder变量类型
    private MealsBuilder mealsBuilderA;
    //对mealsBuilderA的值进行初始化
    public Director(MealsBuilder mealsBuilder ){
        this.mealsBuilderA=mealsBuilder;
    };
    //setMealsBuilder方法组装菜品
    public void setMealsBuilder(){
        mealsBuilderA.setmealOne();
        mealsBuilderA.setMealtwo();
        mealsBuilderA.setMealthree();
        mealsBuilderA.setsoup();
    }

    public Meals getMeals(){
        //返回一个meals对象
        return mealsBuilderA.getMeals();
    }
}

打印

package com.lizheng.Builder.ClassicBuild;

public class Director {
    //声明MealsBuilder变量类型
    private MealsBuilder mealsBuilderA;
    //对mealsBuilderA的值进行初始化
    public Director(MealsBuilder mealsBuilder ){
        this.mealsBuilderA=mealsBuilder;
    };
    //调用方法
    public void setMealsBuilder(){
        mealsBuilderA.setmealOne();
        mealsBuilderA.setMealtwo();
        mealsBuilderA.setMealthree();
        mealsBuilderA.setsoup();
    }

    public Meals getMeals(){
        //返回一个meals对象
        return mealsBuilderA.getMeals();

    }
}

3 Builder变种设计模式

  • 餐馆换老板了,换了一种经营模式,改成了小碗菜经营模式,餐馆固定7个小碗菜,每个价格相同,食客可以任意选择,米饭为必点。
package com.lizheng.Builder.variety;

public class Menu {

    //菜品一
    private String Menuone;
    //菜品二
    private String Menutwo;
    //菜品三
    private String Menuthree;
    //菜品四
    private String Menufour;
    //菜品五
    private String Menufive;
    //菜品六
    private String Menusix;
    //菜品七
    private String Menuseven;
    //米
    private String rice;

    //设置get方法
    public String getMenuone() {
        return Menuone;
    }

    public String getMenutwo() {
        return Menutwo;
    }

    public String getMenuthree() {
        return Menuthree;
    }

    public String getMenufour() {
        return Menufour;
    }

    public String getMenufive() {
        return Menufive;
    }

    public String getMenusix() {
        return Menusix;
    }

    public String getMenuseven() {
        return Menuseven;
    }
    public String rice() {
        return rice;
    }

    //构造方法把值传递给menu
    public Menu(Builder builder){
        this.rice=builder.rice;
        this.Menuone=builder.Menuone;
        this.Menutwo=builder.Menutwo;
        this.Menuthree=builder.Menuthree;
        this.Menufour=builder.Menufour;
        this.Menufive=builder.Menufive;
        this.Menusix=builder.Menusix;
        this.Menuseven=builder.Menuseven;
    }

    //设置一个静态内部类Builder
    public static class Builder{
        //菜品一
        private String Menuone;
        //菜品二
        private String Menutwo;
        //菜品三
        private String Menuthree;
        //菜品四
        private String Menufour;
        //菜品五
        private String Menufive;
        //菜品六
        private String Menusix;
        //菜品七
        private String Menuseven;
        //米
        private String rice;

        public Builder(String rice){
            this.rice=rice;
        }
        //设置菜品一
        public Builder setMenuone(String Menuone){
            this.Menuone=Menuone;
            return this;
        }

        //设置菜品二
        public Builder setMenutwo(String Menutwo){
            this.Menutwo=Menutwo;
            return this;
        }
        //设置菜品三
        public Builder setMenuthree(String Menuthree){
            this.Menuthree=Menuthree;
            return this;
        }
        //设置菜品四
        public Builder setMenufour(String Menufour){
            this.Menufour=Menufour;
            return this;
        }
        //设置菜品五
        public Builder setMenufive(String Menufive){
            this.Menufive=Menufive;
            return this;
        }

        //设置菜品六
        public Builder setMenusix(String Menusix){
            this.Menusix=Menusix;
            return this;
        }

        //设置菜品七
        public Builder setMenuseven(String Menuseven){
            this.Menuseven=Menuseven;
            return this;
        }
        //返回menus对象
        public Menu getCustMenu(){
            return new Menu(this);
        }
    }
}

展示使用

package com.lizheng.Builder.variety;

public class variety {
    public static void main(String[] args) {
        //顾客A的点餐
        Menu menuA=new Menu.Builder("蛋炒饭")
                .setMenuone("红烧肉")
                .setMenutwo("烧白")
                .setMenutwo("青椒肉丝")
                .getCustMenu();

        //顾客B的点餐
        Menu menuB=new Menu.Builder("蛋炒饭")
                .setMenuone("小炒肉")
                .setMenutwo("香辣猪肝")
                .getCustMenu();
    }
}

总结:什么时候会选择这样的设计模式,当一些基本的物料不会变,而其组合经常变化的时候,就可以选择建造者模式来构建代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Builder设计模式是一种创建型设计模式,它用于创建复杂对象,将对象的构建过程与其表示分离。该设计模式使用一个独立的Builder类来构建对象,而不需要直接使用对象的构造函数。 使用Builder设计模式可以将对象的构建逻辑集中在一个地方,使得代码更加清晰和可读,并且便于维护和扩展。它主要包含以下几个角色: 1. Product(产品):产品类是要创建的复杂对象。它包含多个属性,以及对属性赋值的方法。 2. Builder(抽象建造者):Builder类是一个接口或抽象类,定义了构建产品的方法,包括设置产品的属性以及返回构建好的产品。 3. ConcreteBuilder(具体建造者):ConcreteBuilder类实现了Builder接口,实现了构建产品的具体逻辑,包括设置产品的各个属性,并返回构建好的产品。 4. Director(指挥者):Director类是一个调用者,它负责调用具体建造者来构建产品。它将具体建造者和产品分离,只通过接口或抽象类与它们交互。 使用Builder设计模式的典型步骤如下: 1. 创建产品类,定义产品的属性和方法。 2. 创建抽象建造者接口或抽象类,定义构建产品的方法。 3. 创建具体建造者类,实现抽象建造者接口或抽象类,在其中定义具体的产品构建逻辑。 4. 创建指挥者类,负责调用具体建造者来构建产品。 通过以上步骤,我们可以通过调用指挥者的构建方法,来获取构建好的产品对象。使用Builder设计模式,我们可以将产品的构建过程与表示分离,使得产品构建的灵活性和可扩展性增强。同时,也可以降低客户端使用产品构建过程的复杂性,使得客户端的代码更加简洁和易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值