建造者模式——创建型
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
用户只需要指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
类型:创建型
适用场景:
如果一个对象有非常复杂的内部结构(很多属性)
想把复杂对象的创建和使用分离
优点:
封装性好,创建和使用分离
扩展性好、建造类之间独立、一定程度上解耦
缺点:
会产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大
建造者模式与工厂模式:
注重点不同:
建造者模式更注重于方法的调用顺序
工厂模式注重于产品
创建对象的粒度不同:
建造者模式可以创建一些复杂的产品,由各种复杂的部件组成
工厂模式创建出来的都是一个样子
关注点不同:
工厂模式只要把对象创建出来即可
建造者模式不单只要创建出产品,还要知道这个产品都是由那些部件组成的,而且在某些业务场景下,比如说一定的顺序决定了产出的产品不一样的话,那么这里也要对顺序进行调整,工厂则不关心顺序。
coding的UML图V1版:
V2版(链式调用):
Course course = new Course.CourseBuilder.buildCourseName("").buildCoursePPT("").build();
示例:
JDK中
例子一:java.lang.StringBuilder的append()方法
java.lang.StringBuffer的append()方法(不过是加了synchronized同步的关键字)
开源框架中:
例子二:guava中,Immutable不可变这些数据结构的使用方法
Set<String> set = ImmuatbleSet.<String>builder().add("a").add("b").build();
例子三:TokenCache
guava中的CacheBuilder这个类,典型的建造者模式
例子四:Spring中的BeanDefinitionBuilder
例子五:Mybatis中的SqlSessionFactoryBuilder的build方法中,
XMLConfigBuilder的parse方法,parse方法又调用了parseConfiguration
典型的:建造者包装一层建造者