欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > asp.net >内容正文

asp.net

【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

发布时间:2025/6/17 asp.net 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 ) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 一、建造者模式简介
  • 二、建造者模式适用场景
  • 三、建造者模式优缺点
  • 四、建造者模式与工厂模式
  • 五、建造者模式代码示例
    • 1、学生类
    • 2、建造者抽象类
    • 3、建造者实现类
    • 4、教师类 ( 非必须 )
    • 5、测试类
  • 六、实例类和建造者类定义在同一个类中 ( 建造者模式常用用法 )
    • 1、实例类 + 建造者类
    • 2、测试类





一、建造者模式简介



建造者模式 :一个复杂对象构建过程 与其 表示 分离 , 使得 同样的构建过程 , 可以 创建不同的表示 ;

用户只需要 指定 需要建造的类型 就可以 得到该类型对应的产品实例 , 不关心建造过程细节 ;

建造者模式就是 如何逐步构建包含多个组件的对象 , 相同的构建过程 , 可以创建不同的产品 ,


建造者模式类型 : 创建型 ;





二、建造者模式适用场景



建造者模式适用场景 :

  • 结构复杂 : 对象 有 非常复杂的内部结构 , 有很多属性 ;
  • 分离创建和使用 : 想把 复杂对象 的 创建使用 分离 ;

当创造一个对象 需要很多步骤时 , 适合使用建造者模式 ;
当创造一个对象 只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;





三、建造者模式优缺点



建造者模式优点 :

  • 封装性好 : 创建使用 分离 ;
  • 扩展性好 : 建造类之间 相互独立 , 在 一定程度上解耦 ;

建造者模式缺点 :

  • 增加类数量 : 产生多余的 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age='" + age + '\'' +", number='" + number + '\'' +", address='" + address + '\'' +", school='" + school + '\'' +'}';} }

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(); }

3、建造者实现类


package builder;/*** 建造者实现类*/ public class StudentBuilderImpl extends StudentBuilder {private Student student = new Student();@Overridepublic void buildName(String name) {this.student.setName(name);}@Overridepublic void buildAge(String age) {this.student.setAge(age);}@Overridepublic void buildNumber(String number) {this.student.setNumber(number);}@Overridepublic void buildAddress(String address) {this.student.setAddress(address);}@Overridepublic void buildSchool(String school) {this.student.setSchool(school);}@Overridepublic Student makeCourse() {return this.student;} }

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();} }

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);} }

执行结果 :

Student{name='小明', age='12', number='1', address='学院路', school='第一小学'}





六、实例类和建造者类定义在同一个类中 ( 建造者模式常用用法 )




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;}@Overridepublic 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);}} }

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);} }

执行结果 :

Student{name='小明', age='12', number='1', address='学院路', school='第一小学'}

总结

以上是生活随笔为你收集整理的【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。