【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
【摘要】
文章目录
一、建造者模式简介二、建造者模式适用场景三、建造者模式优缺点四、建造者模式与工厂模式五、建造者模式代码示例1、学生类2、建造者抽象类3、建造者实现类4、教师类 ( 非必须 )5、测试类
...
一、建造者模式简介
建造者模式 : 将 一个复杂对象 的 构建过程 与其 表示 分离 , 使得 同样的构建过程 , 可以 创建不同的表示 ;
用户只需要 指定 需要建造的类型 就可以 得到该类型对应的产品实例 , 不关心建造过程细节 ;
建造者模式就是 如何逐步构建包含多个组件的对象 , 相同的构建过程 , 可以创建不同的产品 ,
建造者模式类型 : 创建型 ;
二、建造者模式适用场景
建造者模式适用场景 :
- 结构复杂 : 对象 有 非常复杂的内部结构 , 有很多属性 ;
- 分离创建和使用 : 想把 复杂对象 的 创建 和 使用 分离 ;
当创造一个对象 需要很多步骤时 , 适合使用建造者模式 ;
当创造一个对象 只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;
三、建造者模式优缺点
建造者模式优点 :
- 封装性好 : 创建 和 使用 分离 ;
- 扩展性好 : 建造类之间 相互独立 , 在 一定程度上解耦 ;
建造者模式缺点 :
- 增加类数量 : 产生多余的 Builder 对象 ;
- 内部修改困难 : 如果 产品内部发生变化 , 建造者也要相应修改 ;
四、建造者模式与工厂模式
建造者模式 与 工厂模式 :
- 注重点不同 : 建造者模式 更注重于 方法的调用顺序 ; 工厂模式 注重于 创建产品 , 不关心方法调用的顺序 ;
- 创建对象力度不同 : 创建对象的力度不同 , 建造者模式可以创建复杂的产品 , 由各种复杂的部件组成 , 工厂模式创建出来的都是相同的实例对象 ,
五、建造者模式代码示例
1、学生类
package builder;
/**
* 学生类
*/
public class Student {
private String name;
private String age;
private String number;
private String address;
private String school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", number='" + number + '\'' +
", address='" + address + '\'' +
", school='" + school + '\'' +
'}';
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
2、建造者抽象类
package builder;
/**
* 抽象建造者
*/
public abstract class StudentBuilder {
public abstract void buildName(String name);
public abstract void buildAge(String age);
public abstract void buildNumber(String number);
public abstract void buildAddress(String address);
public abstract void buildSchool(String school);
public abstract Student makeCourse();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
3、建造者实现类
package builder;
/**
* 建造者实现类
*/
public class StudentBuilderImpl extends StudentBuilder {
private Student student = new Student();
@Override
public void buildName(String name) {
this.student.setName(name);
}
@Override
public void buildAge(String age) {
this.student.setAge(age);
}
@Override
public void buildNumber(String number) {
this.student.setNumber(number);
}
@Override
public void buildAddress(String address) {
this.student.setAddress(address);
}
@Override
public void buildSchool(String school) {
this.student.setSchool(school);
}
@Override
public Student makeCourse() {
return this.student;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
4、教师类 ( 非必须 )
package builder;
/**
* 教师类 , 负责使用建造者创建学生信息
*/
public class Teacher {
/**
* 持有学生建造者
*/
private StudentBuilder studentBuilder;
/**
* 构造函数注入建造者
* @param studentBuilder
*/
public Teacher(StudentBuilder studentBuilder) {
this.studentBuilder = studentBuilder;
}
/**
* 调用建造者对象创建 学生 实例对象
* @param name
* @param age
* @param number
* @param address
* @param school
* @return
*/
public Student makeStudent(String name, String age,
String number, String address,
String school) {
this.studentBuilder.buildName(name);
this.studentBuilder.buildAge(age);
this.studentBuilder.buildNumber(number);
this.studentBuilder.buildAddress(address);
this.studentBuilder.buildSchool(school);
return this.studentBuilder.makeCourse();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
5、测试类
package builder;
public class Main {
public static void main(String[] args) {
// 创建学生对象建造者
StudentBuilder studentBuilder = new StudentBuilderImpl();
// 创建教师对象
Teacher teacher = new Teacher(studentBuilder);
// 教师对象使用学生建造者创建学生 实例对象
Student student = teacher.makeStudent(
"小明",
"12" ,
"1",
"学院路",
"第一小学");
System.out.println(student);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
执行结果 :
Student{name='小明', age='12', number='1', address='学院路', school='第一小学'}
- 1

六、实例类和建造者类定义在同一个类中 ( 建造者模式常用用法 )
1、实例类 + 建造者类
package builder2;
/**
* 学生类
*/
public class Student {
private String name;
private String age;
private String number;
private String address;
private String school;
public Student(StudentBuilder builder) {
this.name = builder.name;
this.age = builder.age;
this.number = builder.number;
this.address = builder.address;
this.school = builder.school;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", number='" + number + '\'' +
", address='" + address + '\'' +
", school='" + school + '\'' +
'}';
}
/**
* 使用静态内部类作为创建者
* 将具体的业务类 及其 创建者 定义在一个类中
* 使用链式调用 , 每个 build 步骤都返回创建者本身
*/
public static class StudentBuilder {
private String name;
private String age;
private String number;
private String address;
private String school;
public StudentBuilder buildName(String name) {
this.name = name;
return this;
}
public StudentBuilder buildAge(String age) {
this.age = age;
return this;
}
public StudentBuilder buildNumber(String number) {
this.number = number;
return this;
}
public StudentBuilder buildAddress(String address) {
this.address = address;
return this;
}
public StudentBuilder buildSchool(String school) {
this.school = school;
return this;
}
public Student build() {
return new Student(this);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
2、测试类
package builder2;
public class Main {
public static void main(String[] args) {
// 使用链式调用 , 一行代码创建实例对象
Student student = new Student.StudentBuilder()
.buildName("小明")
.buildAge("12")
.buildNumber("1")
.buildAddress("学院路")
.buildSchool("第一小学")
.build();
System.out.println(student);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
执行结果 :
Student{name='小明', age='12', number='1', address='学院路', school='第一小学'}
- 1

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/119864026
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)