建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的创建过程可以创建不同的表示,用户只需要知道创建的类型就可以构建对象,不用关心构建细节,属于创建型模式。
优点
- 封装性好,创建与使用分离
- 扩展性好,建造类之间独立,一定程度上的解耦
缺点
- 产生多余的builder对象
- 产品内部发生变化,需要改动构造者,不否开闭原则
建造者模式与工厂模式的区别
- 建造者模式更加关注方法调用的顺序,工厂模式关注创建的对象
- 创建对象的力度不同,建造者模式创建复杂对象,由各种复杂的部件组成,工厂模式创建的对象都一样
- 关注点不一样,工厂模式只关注把对象创建出来,建造者模式还要关注他的部件
- 建造者模式更加方法调用的顺序不一样,创建出来的对象也可能不一样
普通写法
// 目标对象
public class Course {
private String name;
private String ppt;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPpt() {
return ppt;
}
public void setPpt(String ppt) {
this.ppt = ppt;
}
}
// 建造者类
public class CourseBuilder {
private Course course = new Course();
public void addName(String name){
course.setName(name);
}
public void addPpt(String ppt){
course.setPpt(ppt);
}
public Course build(){
return course;
}
}
// 使用方法
public class Test {
public static void main(String[] args) {
CourseBuilder courseBuilder = new CourseBuilder();
courseBuilder.addName("java");
courseBuilder.addPpt("java ppt");
Course course = courseBuilder.build();
}
}
建造者链式写法
public class LinkCourseBuilder {
private Course course = new Course();
public LinkCourseBuilder addName(String name){
course.setName(name);
return this;
}
// 返回this
public LinkCourseBuilder addPpt(String ppt){
course.setPpt(ppt);
return this;
}
public Course build(){
return course;
}
}
// test
public class Test {
public static void main(String[] args) {
LinkCourseBuilder builder = new LinkCourseBuilder();
// 链式写法在构造者模式中非常常见
builder.addName("node").addPpt("node ppt");
Course course1 = builder.build();
}
}
java 源码应用
- StringBuilder.append("aa").append(""bb) ...
- mybaits中的CacheBuilder
- spring中BeanDefinitionBuilder