个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
场景:在某公司的管理系统中有一个生成财务报告的需求,要求报表中包含部门基本信息,财务收支信息,并对收支进行评估。对于产生报表这个实例的过程就是一个复杂的过程,所以生成报表实例可以使用建造者模式
结构
- Builder:为创建一个产品对象的各个部件指定抽象接口。(ReportBuilder)
- ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。(PersonnelReport,TechnologyReport)
- Director:构造一个使用Builder接口的对象。(ReportDirector)
- Product:表示被构造的复杂对象。(Report)
设计
实现
代码地址:https://github.com/telundusiji/designpattern
Product 报告
@Data
public class Report {
private String no;
private Date date;
private String department;
private String author;
private double income;
private double outcome;
private String assessment;
}
Builder 报告建造者
public abstract class ReportBuilder {
public abstract void setBaseInformation();
public abstract void setIncomeAndOutcome();
public abstract void assess();
public abstract Report getReport();
}
ConcreteBuilder 人事部报告建造者
public class PersonnelReport extends ReportBuilder {
private Report report;
public PersonnelReport() {
report = new Report();
}
@Override
public void setBaseInformation() {
report.setNo("P.No."+System.currentTimeMillis());
report.setDepartment("Personnel");
report.setAuthor("Personnel.张三");
report.setDate(new Date());
}
@Override
public void setIncomeAndOutcome() {
report.setIncome(Math.random()*10000);
report.setOutcome(Math.random()*10000);
}
@Override
public void assess() {
double income = report.getIncome();
double outcome = report.getOutcome();
if (income>outcome){
report.setAssessment("人事部财务评估:收入大于支出,有收益,开心!");
}else if(income==outcome){
report.setAssessment("人事部财务评估:收入等于支出,无收益,一般!");
}else {
report.setAssessment("人事部财务评估:收入小于支出,无收益,悲伤!");
}
}
@Override
public Report getReport() {
return report;
}
}
ConcreteBuilder 技术部报告建造者
public class TechnologyReport extends ReportBuilder {
private Report report;
public TechnologyReport() {
report = new Report();
}
@Override
public void setBaseInformation() {
report.setNo("T.No."+System.currentTimeMillis());
report.setDepartment("Technology");
report.setAuthor("Technology.李四");
report.setDate(new Date());
}
@Override
public void setIncomeAndOutcome() {
report.setIncome(Math.random()*1000000);
report.setOutcome(Math.random()*1000000);
}
@Override
public void assess() {
double income = report.getIncome();
double outcome = report.getOutcome();
double profit = income - outcome;
report.setAssessment("技术部财务评估:收益"+profit+"!");
}
@Override
public Report getReport() {
return report;
}
}
Director 指导者
public class ReportDirector {
public void produce(ReportBuilder reportBuilder){
reportBuilder.setBaseInformation();
reportBuilder.setIncomeAndOutcome();
reportBuilder.assess();
}
}
优点
- 将复杂对象的创建过程封装起来,隐藏内部结构
- 指定特定生成器,就可以生成特定对象,可以更改创建过程
适用范围
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同表示时。
对于建造者模式和工厂模式的区别:
- 建造者模式用于创建大的复杂的对象,简单的对象可以使用工厂模式(至于这个度的问题还需自己把握)
- 建造者模式强调是一步步创建对象,可以改变步骤生成不同对象
个人公众号【爱做梦的锤子】,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片