建造者模式
定义
建造者模式(Builder Pattern
):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
场景
当一个对象的构造过程非常复杂,比如有特别多的属性,或者构造时有特定的顺序,甚至是属性之间有特殊的依赖关系等,这个时候可以使用构建者模式来创建对象。
假设现在要创建计算机学院各个专业的课程表,每个课程表有七天需要安排,如果单独创建,无疑是非常麻烦的:要么用一个庞大的构造函数,要么声明对象后一个个set,但这两种方法都不是特别优雅,每个课程表的创建分散无法控制。
UML类图
代码
builder
示例:
public class TestBuilder {
@Test
public void test(){
System.out.println(new TimetableDirector(new ComputerScienceTimetableBuilder()).buildTimetable().toString());
System.out.println();
System.out.println(new TimetableDirector(new SoftwareEngineeringTimetableBuilder()).buildTimetable().toString());
/*
Sunday:
Monday: Spoken English
Tuesday: Advanced mathematics
Wednesday: College Physics
Thursday: C Language
Friday: Sports
Saturday: Situation and Policy
Sunday:
Monday: Sports
Tuesday: Discrete Mathematics
Wednesday: College Physics
Thursday: Professional English
Friday: Probability Statistics
Saturday: Situation and Policy
*/
}
}
简化
这样子看起来,构建者模式和抽象工厂方法简直如出一辙,唯一的区别是加了Director
角色处理创建顺序,或者处理属性之间的依赖关,在一定的场景中可以用抽象工厂+模板方法模式来搞定,更多情况下使用的是简化版本的Builder
模式。
首先可以省略掉Director
类,把构造过程放在各自的Builder
或者放在抽象类中,用模板方法模式来代替:
public abstract class TimetableBuilder {
protected Timetable timetable = new Timetable();
public abstract void sunday();
public abstract void monday();
public abstract void tuesday();
public abstract void wednesday();
public abstract void thursday();
public abstract void friday();
public abstract void saturday();
public Timetable buildTimetable(){
sunday();
monday();
tuesday();
wednesday();
thursday();
friday();
saturday();
return timetable;
}
}
使用时:
public class TestBuilder {
@Test
public void test(){
System.out.println(new ComputerScienceTimetableBuilder().buildTimetable().toString());
System.out.println();
System.out.println(new SoftwareEngineeringTimetableBuilder().buildTimetable().toString());
}
}
在我们并不关注构建过程是否统一,构建类能否统一管理时,抽象类都可以省略,每个类型有自己的构建方法,这也是很多复杂对象的创建方式,详见:Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器
这个插件可以自动生成JavaBean的Builder模式代码,可以采用链式调用的方法完成对象的构建,并且可以在build()
方法中检查依赖,代码较少,容易理解。
总结
Builder
模式的好处显而易见:对象的声明和初始化分离,开发人员不必知道创建的具体过程,但可以通过相同的创建过程来创建不同的对象,对于那些创建复杂的对象是非常有帮助的。
Director
或模板方法模式,可以让创建过程条理清晰,代码可读性更高,这只是针对相似类型的创建,假设类型之间的差别太大,那就不建议使用构建者模式。当类型较多时,可能产生大量的构建者,系统变得特别复杂。
因此在业务场景几乎不变并且类型构建过程非常相似的场景下,可以使用构建者模式,在其他情况下,如果也想体验构建者模式带来的便利,可以使用轻量级的构建者模式,即:Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器。