建造者模式
# 建造者模式
建造者模式(Builder Pattern)将一个复杂的对象的构建过程与它的表示,使得同样的构建过程可以创建出不同的表示。
建造者模式属于创建型模式;
> 对于用户而言,使用建造者模式只需要指定需要创建的类型就可以获取对象,创建的过程以及细节不需要了解,根据建造者模式的定义,可以简单的理解
> 为两层含义:
> 1、构建与表示分离;构建代表对象创建,表示代表对象行为,方法,也就是将对象的创建与行为分离;(对应到Java代码,其实就是使用接口规范行为,
> 然后由具体的实现进行构建)
> 2、创建不同的表示;也就是具备同样的行为,但是却由于构建的行为顺序不同或其他原因可以创建出不同的表示;
>
## 类图
// todo
### Course
```text
@Data
@Getter
@Setter
public class Course {
private String name;
private String ppt;
private String video;
private String note;
private String homework;
}
```
###
```text
public class CourseBuilder {
private Course course = new Course();
public CourseBuilder addName(String name){
course.setName(name);
return this;
}
public CourseBuilder addHomework(String homework){
course.setHomework(homework);
return this;
}
public CourseBuilder addVideo(String video){
course.setVideo(video);
return this;
}
public CourseBuilder addPpt(String ppt){
course.setPpt(ppt);
return this;
}
public CourseBuilder addNote(String note){
course.setNote(note);
return this;
}
public Course builder(){
return course;
}
}
```
### DomoTest 测试
```text
public class DomoTest {
public static void main(String[] args) {
CourseBuilder courseBuilder = new CourseBuilder();
courseBuilder.addHomework("课后作业111")
.addName("设计模式")
.addNote("课堂笔记");
System.out.println("courseBuilder = " + courseBuilder.builder());
}
}
```
输出结果:
```text
courseBuilder = Course(name=设计模式, ppt=null, video=null, note=课堂笔记, homework=课后作业111)
```
## 建造者在JDK中的应用
### StringBuilder

```text
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{}
```
### java.lang.StringBuilder.append(java.lang.CharSequence)
```text
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
```
这里的StringBuilder就是一个实现构造器,只不过它的上级还有一个抽象的构造器AbstractStringBuilder;
看到这源码是不是和我们上面举的例子类似呢,这就是JDK源码中很典型的建造者模式的应用;
处理上面的StringBuilder之外,还有像Mybatis框架中的CacheBuilder缓存构造器,还有像SqlSessionFactory装载时的openSession方法都是建造者模式;
## 建造者模式的使用场景
- **适用于创建对象需要很多步骤,但是步骤的顺序不一定是固定的**
- **如果一个对象有非常复杂的内部结构(有很多的成员变量或属性)**
- **把复杂对象的创建和使用分离**
## 建造者模式的优点
- **封装行很好,使得创建过程和使用分离开**
- **扩展性好,建造类之间独立,一定程度上解耦**
- **便于控制细节,建造者可以对创建过程逐步细化,而不对其他模块产生任何影响**
## 建造者模式的缺点
- **产生了对于的Builder对象,造成了类的冗余**
- **如果产品内部发生变化,建造者都要修改,维护成本比较大;不适合经常变动的对象,这样也是不符合开闭原则的**
## 建造者模式和工厂模式的对比
- **建造者模式更加注重方法的调用顺序,工厂模式注重于对象的创建**
- **创建对象的力度不同,建造者模式创建复杂的对象,由各种复杂的组件组成,工厂模式创建出来对象的都一样**
- **关注点不同,工厂模式只需要吧对象创建出来就可以了,而建造者模式中不仅要创建出这个对象,还要知道这个对象由那些组件组成**
- **建造者模式根据建造过程中的顺序不一样,最终的对象不见组成也不一样,对象的每个部件的设置都是很灵活的**