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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值