厦门做外贸网站,网站建设费科目,php二次网站开发步骤,网站建设广告宣传素材楔子
小七在2019年的时候#xff0c;就想写一个关于设计模式的专栏#xff0c;但是最终却半途而废了。粗略一想#xff0c;如果做完一件事要100分钟#xff0c;小七用3分钟热情做的事#xff0c;最少也能完成10件事情了。所以这一次#xff0c;一定要把他做完#xff0…楔子
小七在2019年的时候就想写一个关于设计模式的专栏但是最终却半途而废了。粗略一想如果做完一件事要100分钟小七用3分钟热情做的事最少也能完成10件事情了。所以这一次一定要把他做完fighting
需求背景
以以前小七做的一个政务系统为例为了符合国标数据库表需要设计很多字段大概有100多个。每次new这个实体的时候都会调用大量的set方法关键是这100个字段基本不会变但是他们的组合却经常变弄得开发的小伙伴们苦不堪言于是前辈们就重载了很多的构造方法结果构造方法也爆炸了导致新来的后浪们差点直接被拍死在了沙滩上。
为了简化代码咱们这一次就定义一个Student类里面只包含name和age。
分析设计
因为这个对象的属性很多且组合方式很自由如果使用经典的new-set方式代码大概如下
BigObject bigObject new BigObject();
bigObject.setO1();
bigObject.setO2();
bigObject.setO3();
bigObject.setO4();
bigObject.setO5();
bigObject.setO6();
bigObject.setO7();
bigObject.setO8();
bigObject.setO9();
bigObject.setO10();
...
bigObject.setO100();
看起来并不直观。
如果每一个组合就重载一个构造方法也会产生很多构造方法并且语义不明新来的小伙伴会一脸懵逼。
但是如果我们能够抽象一下产品的构建过程具体建造者类继承自抽象建造者类实现具体的构建逻辑。指挥者类负责调用具体建造者类的构建方法完成产品的构建。这样就可以降低客户端代码的复杂度提高代码的可维护性。
定义类名产品类Student抽象建造者类StudentBuilder具体建造者类StudentActualBuilder指挥者类Commander
标准建造者模式
UML图
根据分析设计我们可以先画一个简单的UML图后面通过UML图编码 模块名称
builder.demo01
模块地址
https://gitee.com/diqirenge/design-pattern/tree/master/src/main/java/com/run2code/design/creational/builder/demo01
模块描述
经典模式代码示例
代码实现
1、定义产品类
/*** 定义产品类* 关注公众号【奔跑的码畜】一起进步不迷路** author 第七人格* date 2023/11/20*/
public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}Overridepublic String toString() {return Student{ name name \ , age age };}
}
2、定义抽象建造者类
/*** 定义抽象建造者类* 关注公众号【奔跑的码畜】一起进步不迷路** author 第七人格* date 2023/11/20*/
public abstract class StudentBuilder {public abstract void buildName(String name);public abstract void buildAge(int age);public abstract Student makeStudent();
}
3、定义具体建造者类
/*** 定义具体建造者类* 关注公众号【奔跑的码畜】一起进步不迷路** author 第七人格* date 2023/11/20*/
public class StudentActualBuilder extends StudentBuilder {/*** 这里使用组合将 student 组合到实现类中*/private Student student new Student();Overridepublic void buildName(String name) {student.setName(name);}Overridepublic void buildAge(int age) {student.setAge(age);}Overridepublic Student makeStudent() {return student;}
}
4、定义指挥者类
/*** 定义指挥者类* 关注公众号【奔跑的码畜】一起进步不迷路** author 第七人格* date 2023/11/20*/
public class Commander {/*** 注入StudentBuilder*/private StudentBuilder studentBuilder;public void setStudentBuilder(StudentBuilder studentBuilder) {this.studentBuilder studentBuilder;}public Student makeStudent(String name, int age) {this.studentBuilder.buildAge(age);this.studentBuilder.buildName(name);return this.studentBuilder.makeStudent();}
}
5、测试
public class BuilderStudentBuilderTest {Testpublic void testBuild_01() {System.out.println(标准建造者模式开始);StudentActualBuilder studentActualBuilder new StudentActualBuilder();Commander commander new Commander();commander.setStudentBuilder(studentActualBuilder);// 客户端使用指挥者类创建产品对象这样可以降低客户端代码的复杂度提高代码的可维护性。Student student commander.makeStudent(第七人格, 18);System.out.println(student);System.out.println(标准建造者模式结束);}
}
6、测试结果 标准建造者模式开始 Student{name第七人格, age18} 标准建造者模式结束 实现要点
定义产品类产品类是最终要构建的对象包含多个属性和方法。 定义抽象建造者类抽象建造者类定义了产品的构建过程包括各个部分的构建方法和返回最终产品的方法。 定义具体建造者类具体建造者类继承自抽象建造者类实现具体的构建逻辑。 定义指挥者类指挥者类负责调用具体建造者类的构建方法完成产品的构建。
用过StringBuilder的我们知道StringBuilder有个append方法我们学着StringBuilder将上面的代码改为链式调用。
链式调用模式
URL图 模块名称
builder.demo02
模块地址
https://gitee.com/diqirenge/design-pattern/tree/master/src/main/java/com/run2code/design/creational/builder/demo02
模块描述
建造者-链式调用
代码实现
/*** 链式调用建造者示例* 关注公众号【奔跑的码畜】一起进步不迷路** author 第七人格* date 2023/11/20*/
public class Student02Builder {/*** 姓名*/private String name;/*** 年龄*/private int age;/*** 学生类的构造函数** param name 的名字* param age 年龄*/Student02Builder(String name, int age) {this.name name;this.age age;}/*** 构建器本质上就是指挥者Commander** return {link StudentBuilder}*/public static Student02Builder.StudentBuilder builder() {// 构造一个StudentBuilder对象return new Student02Builder.StudentBuilder();}/*** 学生构建器相当于StudentBuilder及其实现类StudentActualBuilder** author 第七人格* date 2020/12/02*/public static class StudentBuilder {private String name;private int age;public StudentBuilder() {}public Student02Builder.StudentBuilder name(String name) {this.name name;// 返回自身StudentBuilder以便链式调用return this;}public Student02Builder.StudentBuilder age(int age) {this.age age;// 返回自身StudentBuilder以便链式调用return this;}/*** 构建** return {link Student02Builder}*/public Student02Builder build() {// 构造一个Student对象其中的属性直接从外部传入return new Student02Builder(this.name, this.age);}Overridepublic String toString() {return Student.StudentBuilder(name this.name , age this.age );}}Overridepublic String toString() {return Student{ name name \ , age age };}
}
测试
Test
public void testBuild_02() {System.out.println(工作中常用-建造者模式开始);System.out.println(Student02Builder.builder().age(18).name(第七人格).build());System.out.println(工作中常用-建造者模式开始);
}
测试结果 链式调用-建造者模式开始 Student{name第七人格, age18} 链式调用-建造者模式开始 实现要点
1、使用静态方法替换指挥者Commander
public static Student02Builder.StudentBuilder builder() {// 构造一个StudentBuilder对象return new Student02Builder.StudentBuilder();
}
2、使用内部类替换StudentBuilder及StudentActualBuilder
3、内部类中设置属性的时候返回自身以便链式调用 面对对象面对君不负代码不负卿
文章转载自: http://www.morning.xgkxy.cn.gov.cn.xgkxy.cn http://www.morning.tkhyk.cn.gov.cn.tkhyk.cn http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn http://www.morning.lwlnw.cn.gov.cn.lwlnw.cn http://www.morning.ptqds.cn.gov.cn.ptqds.cn http://www.morning.rkqkb.cn.gov.cn.rkqkb.cn http://www.morning.lmbm.cn.gov.cn.lmbm.cn http://www.morning.hjwzpt.com.gov.cn.hjwzpt.com http://www.morning.qwdqq.cn.gov.cn.qwdqq.cn http://www.morning.hncrc.cn.gov.cn.hncrc.cn http://www.morning.wwkdh.cn.gov.cn.wwkdh.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.bfwk.cn.gov.cn.bfwk.cn http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.wbyqy.cn.gov.cn.wbyqy.cn http://www.morning.zwznz.cn.gov.cn.zwznz.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.gzgwn.cn.gov.cn.gzgwn.cn http://www.morning.jpwmk.cn.gov.cn.jpwmk.cn http://www.morning.dztp.cn.gov.cn.dztp.cn http://www.morning.joinyun.com.gov.cn.joinyun.com http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.ryrpq.cn.gov.cn.ryrpq.cn http://www.morning.jqcrf.cn.gov.cn.jqcrf.cn http://www.morning.skrww.cn.gov.cn.skrww.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.jfqqs.cn.gov.cn.jfqqs.cn http://www.morning.kfsfm.cn.gov.cn.kfsfm.cn http://www.morning.lizimc.com.gov.cn.lizimc.com http://www.morning.lkthj.cn.gov.cn.lkthj.cn http://www.morning.cctgww.cn.gov.cn.cctgww.cn http://www.morning.lgsqy.cn.gov.cn.lgsqy.cn http://www.morning.ndngj.cn.gov.cn.ndngj.cn http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn http://www.morning.ptwrz.cn.gov.cn.ptwrz.cn http://www.morning.qbtkg.cn.gov.cn.qbtkg.cn http://www.morning.mhdwp.cn.gov.cn.mhdwp.cn http://www.morning.kwpnx.cn.gov.cn.kwpnx.cn http://www.morning.pcgjj.cn.gov.cn.pcgjj.cn http://www.morning.wkgyz.cn.gov.cn.wkgyz.cn http://www.morning.lxqyf.cn.gov.cn.lxqyf.cn http://www.morning.lsnbx.cn.gov.cn.lsnbx.cn http://www.morning.kphyl.cn.gov.cn.kphyl.cn http://www.morning.ntgjm.cn.gov.cn.ntgjm.cn http://www.morning.pctql.cn.gov.cn.pctql.cn http://www.morning.pqppj.cn.gov.cn.pqppj.cn http://www.morning.gsdbg.cn.gov.cn.gsdbg.cn http://www.morning.twdkt.cn.gov.cn.twdkt.cn http://www.morning.rqqmd.cn.gov.cn.rqqmd.cn http://www.morning.srgwr.cn.gov.cn.srgwr.cn http://www.morning.tnktt.cn.gov.cn.tnktt.cn http://www.morning.muniubangcaishui.cn.gov.cn.muniubangcaishui.cn http://www.morning.mnnxt.cn.gov.cn.mnnxt.cn http://www.morning.spfq.cn.gov.cn.spfq.cn http://www.morning.ndngj.cn.gov.cn.ndngj.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.rqckh.cn.gov.cn.rqckh.cn http://www.morning.wnzgm.cn.gov.cn.wnzgm.cn http://www.morning.hjrjr.cn.gov.cn.hjrjr.cn http://www.morning.crxdn.cn.gov.cn.crxdn.cn http://www.morning.lflnb.cn.gov.cn.lflnb.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.c7513.cn.gov.cn.c7513.cn http://www.morning.tygn.cn.gov.cn.tygn.cn http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn http://www.morning.gfhng.cn.gov.cn.gfhng.cn http://www.morning.rhjhy.cn.gov.cn.rhjhy.cn http://www.morning.pjyrl.cn.gov.cn.pjyrl.cn http://www.morning.wqsjx.cn.gov.cn.wqsjx.cn http://www.morning.zcsyz.cn.gov.cn.zcsyz.cn http://www.morning.yhxhq.cn.gov.cn.yhxhq.cn http://www.morning.txrkq.cn.gov.cn.txrkq.cn http://www.morning.yszrk.cn.gov.cn.yszrk.cn http://www.morning.xyjlh.cn.gov.cn.xyjlh.cn http://www.morning.nbgfz.cn.gov.cn.nbgfz.cn http://www.morning.tgtrk.cn.gov.cn.tgtrk.cn http://www.morning.bwznl.cn.gov.cn.bwznl.cn http://www.morning.hlrtzcj.cn.gov.cn.hlrtzcj.cn