专业公司网站建设,电商的推广主要是做什么的,百年建筑网,4线城市搞网站开发说明#xff1a;本文介绍设计模式中#xff0c;创建型设计模式中的最后一个#xff0c;建造者模式#xff1b;
入学报道
创建型模式#xff0c;关注于对象的创建#xff0c;建造者模式也不例外。假设现在有一个场景#xff0c;高校开学#xff0c;学生、教师、职工都…说明本文介绍设计模式中创建型设计模式中的最后一个建造者模式
入学报道
创建型模式关注于对象的创建建造者模式也不例外。假设现在有一个场景高校开学学生、教师、职工都要办理相关的报道手续如签到、个人信息录入、分配身份证明学生证、教师证、职工证等等
首先创建一个抽象类如下
Person人员类有签到、个人信息、身份证明属性
/*** 人员*/
public class Person {/*** 签到*/private String signIn;/*** 个人信息*/private String profile;/*** 身份证明*/private String idCard;public String getSignIn() {return signIn;}public void setSignIn(String signIn) {this.signIn signIn;}public String getProfile() {return profile;}public void setProfile(String profile) {this.profile profile;}public String getIdCard() {return idCard;}public void setIdCard(String idCard) {this.idCard idCard;}
}在创建具体对象之前先创建一个抽象的建造者类用于统一方法定义人员对象
PersonBuilder人员建造者
/*** 抽象建造者*/
public abstract class PersonBuilder {Person person new Person();/*** 签到行为*/public abstract void buildSignIn();/*** 录入个人信息*/public abstract void buildProfile();/*** 办理身份证明*/public abstract void buildIdCard();/*** 建造完成* return*/public Person build() {return person;}
}Student学生类继承人员建造者重写学生入学相关方法
/*** 学生入学*/
public class Student extends PersonBuilder {Overridepublic void buildSignIn() {person.setSignIn(学生已签到);}Overridepublic void buildProfile() {person.setProfile(学生信息已录入);}Overridepublic void buildIdCard() {person.setIdCard(学生证已办理);}
}Teacher教师类继承人员建造者重写教师入学相关方法
/*** 教师入学*/
public class Teacher extends PersonBuilder {Overridepublic void buildSignIn() {person.setSignIn(老师已签到);}Overridepublic void buildProfile() {person.setProfile(老师个人信息已录入);}Overridepublic void buildIdCard() {person.setIdCard(老师身份证已办理);}
}Employee职工类继承人员建造者重写职工入学相关方法
/*** 职工入学*/
public class Employee extends PersonBuilder {Overridepublic void buildSignIn() {person.setSignIn(员工已签到);}Overridepublic void buildProfile() {person.setProfile(员工个人信息已录入);}Overridepublic void buildIdCard() {person.setIdCard(员工身份证已办理);}
}再创建一个建造者控制类协调入学后的具体事宜如先签到、后录入个人信息最后才发身份证明返回建造完成的人员对象
PersonController人员入学控制器
/*** 人员入学控制器*/
public class PersonController {/*** 人员入学* return*/public Person construct(PersonBuilder personBuilder) {personBuilder.buildSignIn();personBuilder.buildProfile();personBuilder.buildIdCard();return personBuilder.build();}
}Client客户端演示人员入学过程
/*** 客户端*/
public class Client {public static void main(String[] args) {// 一个学生入学Person student new PersonController().construct(new Student());System.out.println(student.getSignIn());System.out.println(student.getProfile());System.out.println(student.getIdCard());System.out.println();// 一个老师入学Person teacher new PersonController().construct(new Teacher());System.out.println(teacher.getSignIn());System.out.println(teacher.getProfile());System.out.println(teacher.getIdCard());}
}执行结果可见对象已创建完成 改进与优化
在《设计模式的艺术》第一版刘伟著中作者关于PersonController人员控制器类的作用有两点改进与优化的地方如下
改进可省略PersonController
可在抽象建造者类PersonBuilder人员建造者中定义一个静态的Person变量这样就不需要额外设立一个PersonController类了如下
PersonBuilder抽象人员建造者既统一了方法也完成了建造的流程
/*** 抽象建造者*/
public abstract class PersonBuilder {/*** 定义一个抽象的Person*/protected static Person person new Person();/*** 签到行为*/public abstract void buildSignIn();/*** 录入个人信息*/public abstract void buildProfile();/*** 办理身份证明*/public abstract void buildIdCard();/*** 建造Person* return*/public static Person build(PersonBuilder personBuilder) {personBuilder.buildSignIn();personBuilder.buildProfile();personBuilder.buildIdCard();return person;}
}Client客户端使用人员建造者的build()方法建造对象
/*** 客户端*/
public class Client {public static void main(String[] args) {// 一个学生入学Person student PersonBuilder.build(new Student());System.out.println(student.getSignIn());System.out.println(student.getProfile());System.out.println(student.getIdCard());System.out.println();// 一个老师入学Person teacher PersonBuilder.build(new Teacher());System.out.println(teacher.getSignIn());System.out.println(teacher.getProfile());System.out.println(teacher.getIdCard());}
}执行效果相同 优化细化建造过程
可以定义一个“钩子”方法“钩子”方法一般是“isXXX”命名的返回值为boolean类型。利用“钩子”方法规定某些人员可以跳过或者必须执行某方法来细化对象建造的流程。如规定教师人员的建造因为教师流动不大可以跳过录入信息流程。
就可以在PersonBuilder类中定义一个“钩子”方法默认返回true即默认所有人员都需要录入个人信息。如下
/*** 抽象建造者*/
public abstract class PersonBuilder {/*** 定义一个抽象的Person*/protected static Person person new Person();/*** 签到行为*/public abstract void buildSignIn();/*** 录入个人信息*/public abstract void buildProfile();/*** 办理身份证明*/public abstract void buildIdCard();/*** 钩子方法表示默认所有人都需要经过buildProfile()方法具体由子类实现*/public boolean isBuildProfile() {return true;}/*** 建造Person* return*/public static Person build(PersonBuilder personBuilder) {personBuilder.buildSignIn();// 根据钩子方法判断是否需要buildProfile()if (personBuilder.isBuildProfile()) {personBuilder.buildProfile();}personBuilder.buildIdCard();return person;}
}教师类中可以重写这个“钩子”方法表示不需要执行录入个人信息这个流程了。
/*** 教师入学*/
public class Teacher extends PersonBuilder {Overridepublic void buildSignIn() {person.setSignIn(老师已签到);}Overridepublic void buildProfile() {person.setProfile(老师个人信息已录入);}Overridepublic void buildIdCard() {person.setIdCard(老师身份证已办理);}Overridepublic boolean isBuildProfile() {return false;}
}客户端代码不变执行
/*** 客户端*/
public class Client {public static void main(String[] args) {// 一个学生入学Person student PersonBuilder.build(new Student());System.out.println(student.getSignIn());System.out.println(student.getProfile());System.out.println(student.getIdCard());System.out.println();// 一个老师入学Person teacher PersonBuilder.build(new Teacher());System.out.println(teacher.getSignIn());System.out.println(teacher.getProfile());System.out.println(teacher.getIdCard());}
}
执行结果可以看到教师确实是没有执行录入个人信息的方法但是因为Person是static修饰的属性打印的是上面学生的值。 那么如果避免这个问题值得思考或者就不省略PersonController类。
小结
建造者模式通过定义一个抽象建造者类封装了对象创建的细节另外通过“钩子”方法可细化对象创建过程降低了系统复杂度维护了系统的灵活性和扩展性。
总结
本文参考《设计模式的艺术》、《秒懂设计模式》两书