建造者模式
坚持不懈,不断学习
建造模式解决的痛点
- 不优雅
- 不方便阅读
new Label(0,1,0,1,0,2);
- 容易出错(赋值后再进行更改)
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();
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/17252755.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)