建造者模式

坚持不懈,不断学习

建造模式解决的痛点

  1. 不优雅
  2. 不方便阅读
new Label(0,1,0,1,0,2);
  1. 容易出错(赋值后再进行更改)
Label label1=new Label();
label.setWater(0);
label.setWater(2);

场景引入

只是举例(可能不符合实际场景):

假设下面Label是某公司的营养标签

Class Label{

    Integer water;
    Integer sodium; // 钠元素
    Integer protein;// 蛋白质
    Integer VA; // 维生素A
    Integer VB; // 维生素B
    Integer VC; // 维生素C

}

我生产了一瓶纯水(只有水)
我生产了一瓶饮料(有水、维生素A)
我生产了一包肉(有水、蛋白质、维生素C)

那么你会怎么设计这个类?

第一种方案

Class Label{

    Integer water;
    Integer sodium; // 钠元素
    Integer protein;// 蛋白质
    Integer VA; // 维生素A
    Integer VB; // 维生素B
    Integer VC; // 维生素C

    public Label(Integer Water){
        this.water=water;
    }
    public Label(Integer Water,Integer VA){
        this.water=water;
        this.VA=VA;
    }
    public Label(Integer Water,Integer protein,Integer VC){
        this.water=water;
        this.protein=protein;
        this.VC=VC;
    }

}

一看,可以解决上面的问题。又一看,不优雅(优雅的代码,自己看着也舒服),假如新增加一个牛奶(水、蛋白质、维生素A)怎么办?构造方法排列组合()。

第二种方案

Class Label{

    Integer water;
    Integer sodium; // 钠元素
    Integer protein;// 蛋白质
    Integer VA; // 维生素A
    Integer VB; // 维生素B
    Integer VC; // 维生素C


    public Label(Integer Water,Integer protein,Integer VA,Integer VB,Integer VC){
        this.water=water==null? 0: water;
        this.protein=protein==null? 0: protein;
        this.VA=VA==null? 0: VA;
        this.VB=VB==null? 0: VB;
        this.VC=VC==null? 0: VC;
    }

}

一看,可以解决上面的问题。又一看,不优雅(优雅的代码,自己看着也舒服)
看看实际怎么使用的?

new Label(0,0,0,0,0,0,0,0,0,0,0,0,5,1,2,5,0,0,1,0,0);
new Label(0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);

不优雅

第三种方案

JavaBean

Class Label{

    Integer water;
    Integer sodium; // 钠元素
    Integer protein;// 蛋白质
    Integer VA; // 维生素A
    Integer VB; // 维生素B
    Integer VC; // 维生素C


    public Label(){}

    public void setWater(Integer water){
        this.water=water;
    }
    public void setSodium(Integer sodium){
        this.sodium=sodium;
    }
    public void setProtein(Integer protein){
        this.protein=protein;
    }
    public void setVA(Integer VA){
        this.VA=VA;
    }
    public void setVB(Integer VB){
        this.VB=VB;
    }
    public void setVC(Integer VC){
        this.VC=VC;
    }

}

你猜猜什么问题?不优雅。😏
JavaBean模式怎么进行操作呢?

Label milkLabel=new Label();
milkLabel.setWater(1);// 主打一个实惠,全是奶
milkLabel.setProtein(0.01);// 假牛奶

会产生一个什么问题呢?不优雅(ps:再提这三字,直接爬🤬)
实例化对象在前,赋值在后,会出现属性漏赋值,或者二次更改的情况。

别生气,为了补偿你,额外送一个链式模式

Class Label{

   Integer water;
   Integer sodium; // 钠元素
   Integer protein;// 蛋白质
   Integer VA; // 维生素A
   Integer VB; // 维生素B
   Integer VC; // 维生素C


   public Label(){}

   public Label setWater(Integer water){
       this.water=water;
       return this;
   }
   public Label setSodium(Integer sodium){
       this.sodium=sodium;
       return this;
   }
   public Label setProtein(Integer protein){
       this.protein=protein;
       return this;
   }
   public Label setVA(Integer VA){
       this.VA=VA;
       return this;
   }
   public Label setVB(Integer VB){
       this.VB=VB;
       return this;
   }
   public Label setVC(Integer VC){
       this.VC=VC;
       return this;
   }

}

new Label().setWater(1).setProtein(0.1);

这样就好了吗? 主角还没登场呢。

终极建造者模式

改造:


Class Label{

    private final Integer water;
    private final Integer sodium; // 钠元素
    private final Integer protein;// 蛋白质
    private final Integer VA; // 维生素A
    private final Integer VB; // 维生素B
    private final Inteegr VC; // 维生素C


    public Label(Builder builder){
        this.water=builder.water;
        this.protein=builder.protein;
        this.VA=builder.VA;
        this.VB=builder.VB;
        this.VC=builder.VC;
    }
    public static Class Builder{
        private Integer water;
        private Integer sodium; // 钠元素
        private Integer protein;// 蛋白质
        private Integer VA; // 维生素A
        private Integer VB; // 维生素B
        private Integer VC; // 维生素C

        public Builder(){}

        public Label setWater(Integer water){
            this.water=water;
            return this;
        }
        public Label setSodium(Integer sodium){
            this.sodium=sodium;
            return this;
        }
        public Label setProtein(Integer protein){
            this.protein=protein;
            return this;
        }
        public Label setVA(Integer VA){
            this.VA=VA;
            return this;
        }
        public Label setVB(Integer VB){
            this.VB=VB;
            return this;
        }
        public Label setVC(Integer VC){
            this.VC=VC;
            return this;
        }
        public Label build(){
            return new Label(this);
        }
    }

}

new Label.Builder().setWater(1).setProtein(0.01).build();

image

posted @   帅气的涛啊  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示

目录