java 计划模式 制作者模式

打印 上一主题 下一主题

主题 933|帖子 933|积分 2803

制作者模式

什么是制作者模式

制作者模式(Builder Pattern)是一种计划模式,属于创建型模式之一。它的重要目标是通过一步步构建一个复杂对象的方式,避免了构造过程中的混乱和复杂性。这个模式通常用于构建一个具有多个属性复杂布局的对象,可以通过分步设置属性构建对象,而不须要构造函数中通报大量的参数。
在制作者模式中,通常会有:
Product(产物):最终被构建的复杂对象。
Builder(制作者):界说了构建产物的步骤,并提供设置各个属性的方法。
Director(导演者):负责指挥怎样构建产物,但不涉及具体构建的细节。
ConcreteBuilder(具体制作者):实现了Builder接口,提供具体的构建过程。
没有特殊复杂的场景Director和ConcreteBuilder可以省略
制作者模式的作用:

分离构建和体现:将复杂对象的构建过程和体现分离。利用制作者模式可以让客户端关注怎样构建对象,而不须要了解对象的构建细节。
提高代码可读性和可维护性:在构造一个对象时,假如须要设置多个参数,制作者模式可以通过方法链或分步设置来简化代码。
构建具有复杂布局的对象:假如对象的构建过程复杂,具有多个可选的参数或多个步骤,制作者模式非常适用。
灵活性:可以通过不同的制作者来创建不同体现的对象,从而提高灵活性。
示例

手动实现制作者模式

这里假设Person是个复杂的对象,我们给他属性赋值的时候,以前会Person person=new Person(); 然后person.setName()赋值,然后又person.setAge()赋值,如许非常贫苦,这时候就可以利用制作者模式,创建一个制作者, new Person.PersonBuilder() .setName(“John”).setAge(30).setAddress(“123 Main St”).build();方式创建对象
  1. // 复杂的对象:Person类
  2. public class Person {
  3.     private String name;
  4.     private int age;
  5.     private String address;
  6.     // 私有构造函数,防止直接实例化
  7.     private Person(PersonBuilder builder) {
  8.         this.name = builder.name;
  9.         this.age = builder.age;
  10.         this.address = builder.address;
  11.     }
  12.     public String getName() {
  13.         return name;
  14.     }
  15.     public int getAge() {
  16.         return age;
  17.     }
  18.     public String getAddress() {
  19.         return address;
  20.     }
  21.     // 建造者:PersonBuilder类,定义了构建过程
  22.     public static class PersonBuilder {
  23.         private String name;
  24.         private int age;
  25.         private String address;
  26.         // 设置name
  27.         public PersonBuilder setName(String name) {
  28.             this.name = name;
  29.             return this;
  30.         }
  31.         // 设置age
  32.         public PersonBuilder setAge(int age) {
  33.             this.age = age;
  34.             return this;
  35.         }
  36.         // 设置address
  37.         public PersonBuilder setAddress(String address) {
  38.             this.address = address;
  39.             return this;
  40.         }
  41.         // 构建Person对象
  42.         public Person build() {
  43.             return new Person(this);
  44.         }
  45.     }
  46.     @Override
  47.     public String toString() {
  48.         return "Person{name='" + name + "', age=" + age + ", address='" + address + "'}";
  49.     }
  50. }
复制代码
制作者模式创建Person对象
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         // 使用建造者模式创建Person对象
  4.         Person person = new Person.PersonBuilder()
  5.                 .setName("John")
  6.                 .setAge(30)
  7.                 .setAddress("123 Main St")
  8.                 .build();
  9.         System.out.println(person); // 输出:Person{name='John', age=30, address='123 Main St'}
  10.     }
  11. }
复制代码
利用lombok优化

我们利用Lombok来简化制作者模式。通过Lombok的@Builder注解,我们可以省去手动编写制作者类的工作。
  1. import lombok.Builder;
  2. import lombok.ToString;
  3. @Builder
  4. @ToString
  5. public class Person {
  6.     private String name;
  7.     private int age;
  8.     private String address;
  9. }
复制代码
Lombok构建 Person 对象
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         // 使用Lombok生成的建造者模式创建Person对象
  4.         Person person = Person.builder()
  5.                 .name("John")
  6.                 .age(30)
  7.                 .address("123 Main St")
  8.                 .build();
  9.         System.out.println(person); // 输出:Person(name=John, age=30, address=123 Main St)
  10.     }
  11. }
复制代码
利用@Builder注解,Lombok自动为类天生了一个制作者类,开发者不再须要显式地界说PersonBuilder类。
Lombok还为Person类自动天生了构建器的全部方法(name、age、address),以及build()方法来创建对象。
利用@ToString注解,可以自动天生toString()方法,减少了代码量。
Lombok的 @Builder 注解怎样工作?

Lombok注解处置惩罚器:当我们在Person类上添加@Builder注解时,Lombok会自动在编译时天生一个静态嵌套类PersonBuilder,其中包罗每个字段的set方法
**build()**方法:@Builder注解还会自动天生一个build()方法,用于构建最终的Person对象。
链式调用:Lombok通过自动天生的set方法实现链式调用,使得可以像手动实现制作者模式那样利用Person.builder().name(…).age(…).address(…).build()的方式来创建对象。
天生的代码

会自动天生一下代码
  1. public static class PersonBuilder {
  2.     private String name;
  3.     private int age;
  4.     private String address;
  5.     // 为每个字段生成set方法
  6.     public PersonBuilder name(String name) {
  7.         this.name = name;
  8.         return this;
  9.     }
  10.     public PersonBuilder age(int age) {
  11.         this.age = age;
  12.         return this;
  13.     }
  14.     public PersonBuilder address(String address) {
  15.         this.address = address;
  16.         return this;
  17.     }
  18.     // 构建Person对象
  19.     public Person build() {
  20.         return new Person(this);
  21.     }
  22. }
复制代码
Spring Boot中利用制作者模式的地方

Spring Boot中的ApplicationContext和SpringApplication

Spring Boot的设置文件(application.properties 或 application.yml)

Spring Boot的很多设置项利用制作者模式进行初始化。好比,通过@ConfigurationProperties大概@Value注解来加载设置,并通过制作者模式将设置值赋给Java对象。
比方,在application.properties中:
  1. server:
  2.         port:8080
  3. server:
  4.         servlet:
  5.                 context-path:/myapp
复制代码
对应java对象
  1. @ConfigurationProperties(prefix = "server")
  2. public class ServerProperties {
  3.     private int port;
  4.     private String contextPath;
  5.     // getter and setter methods
  6. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表