建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
特征:用户只需要指定需要构建类型就可以获得对象,不需要了解构建过程和细节。属于创建型模式。
适用场景:
- 适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。
- 如果一个对象有非常复杂的内部结构(很多属性),也可以用建造者模式。
- 把复杂对象的创建和使用分离。
简单建造者
public interface IBuilder {
Object build();
}
// 通过建造者类将构建对象的过程封装起来,并通过build方法返回对象
public class CourseBuilder implements IBuilder {
Course course = new Course();
public void addName(String name) { course.setName(name); }
public void addPpt(String ppt) { course.setPpt(ppt); }
public void addVideo(String video) { course.setVideo(video); }
public void addNote(String note) { course.setNote(note); }
@Override
public Course build() {
return course;
}
}
public class SimpleBuilderTest {
public static void main(String[] args) {
CourseBuilder builder = new CourseBuilder();
builder.addName("建造者模式");
builder.addNote("课后笔记");
builder.addPpt("讲义");
builder.addVideo("视频讲解");
Course course = builder.build();
System.out.println(course);
}
}
建造者模式中应用链式编程
public class CourseBuilder implements IBuilder {
Course course = new Course();
public CourseBuilder addName(String name) { course.setName(name); return this;}
public CourseBuilder addPpt(String ppt) { course.setPpt(ppt); return this;}
public CourseBuilder addVideo(String video) { course.setVideo(video); return this;}
public CourseBuilder addNote(String note) { course.setNote(note); return this;}
@Override
public Course build() {
return course;
}
}
// 在建造者模式中用链式编程
public class ChainBuilderTest {
public static void main(String[] args) {
CourseBuilder builder = new CourseBuilder();
builder.addName("设计模式").addNote("笔记").addPpt("PPT").addVideo("录播视频");
Course course = builder.build();
System.out.println(course);
}
}
建造者模式在源码中的应用
StringBuilder:线程不安全的
StringBuffer:线程安全的
MyBatis中CacheBuilder
SqlSessionFactoryBuilder
Spring中BeanDefinitionBuilder
// StringBuilder 源码append方法
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
// StringBuilder使用
StringBuilder sb = new StringBuilder();
sb.append("a").append("b").append("c").append("d");
// StringBuffer 源码append方法
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
// StringBuffer使用
StringBuffer sb = new StringBuffer();
sb.append("a").append("b").append("c").append("d");
建造者模式优点:
- 封装性好,将创建和使用分离。
- 扩展性好,创建类之间独立,一定程度上解耦。
建造者模式缺点:
- 产生多于的builder对象
- 产生内部发生变化,建造者都要修改,改动成本较大。
建造者模式与工厂模式的区别:
- 建造者模式更加注重方法的调用顺序和构建过程,工厂模式注重于创建对象。
- 创建对象的力度不同,建造者模式创建复杂对象,由各种部件组成,不同的部件创建出来的对象不同,而工厂模式创建出来的都一样。
- 关注点不同,工厂模式只需要把对象创建出来就可以了,而建造者模式不仅要创建出对象,还要知道对象由哪些部件组成。
- 建造者模式根据创建过程中的顺序不同,最终的对象组成部件也不一样。
面试题
链式编程是建造者模式的标配吗?
链式编程并不是建造者模式的标配,但是为了用户使用更加便捷,代码更加美观,在使用建造者模式时一般会结合链式编程。