将一个复杂对象的构建过程与它的表示分离, 使得同样的构建过程可以创建不同的表示,属于创建型模式。
特征: 只需指定需要建造的类型就可以获得对象, 建造过程及细节不需要了解。属于创建型模式
使用场景: 创建对象需要很多步骤, 但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构(很多属性), 可以将复杂对象的创建和使用进行分离。
@Data public class Course { private String name; private String ppt; private String video; private String note; private String homework; }
public class CourseBuilder { private 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; } public CourseBuilder addHomework(String homework) { course.setHomework(homework); return this; } public Course build() { return course; } }
public static void main(String[] args) { CourseBuilder builder = new CourseBuilder(); builder.addName("设计模式").addPPT("【PPT课件】") .addVideo("【回放视频】").addNote("【课堂笔记】").addHomework("【课后作业】"); System.out.println(builder.build()); }
应用: JDK中的StringBuilder, Mybatis中的CacheBuilder、SqlSessionFactoryBuilder,Spring中的BeanDefinitionBuilder。
优点:
封装性好,创建和使用分离
扩展性好,建造类之间独立、一定程度上解耦
缺点:
产生多余的Builder对象
产品内部发生变化, 建造者都要修改,不符合开闭原则
建造者模式和工厂模式的区别
建造者模式 | 工厂模式 | |
建造者模式更加注重方法的调用顺序 | 工厂模式注重于创建对象 | |
创建对象的力度不同 | 建造者模式创建复杂的对象,由各种复杂的部件组成 | 工厂模式创建出来的都一样 |
关注点 | 不仅要创建出这个对象,还要知道这个对象由那些部件组成 | 只需要把对象创建出来就可以了 |
建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样 |
来源:oschina
链接:https://my.oschina.net/u/2954646/blog/3183046