设计模式-建造者模式(build模式)

建造者模式

又叫build模式

定义

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示

使用场景

当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

解决什么问题

比如说我们有这么一个类 其中的 productName是必须要的,其余参数是可选的,我们通常用两种方式实例化类并给他们的成员变量赋值

 class Product {
    private final String productName;
    private final String companyName;
    private final String part1;
    private final String part2;
    private final String part3;
    private final String part4;
    }

折叠构造函数模式(telescoping constructor pattern )

就是多个不同参数的构造方法,这个我们经常用,如下代码所示,博主这边为了代码方便只写一个

 /**
     * 构造方法构造 g
     */
    public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
        this.productName = productName;
        this.companyName = companyName;
        this.part1 = part1;
        this.part2 = part2;
        this.part3 = part3;
        this.part4 = part4;
    }

Javabean 模式

就是set方法调用,由于为了掩饰特殊情况,成员变量被final 修饰了成了常量 无法使用set方法,所以就不演示了,这种情况下用build模式是最好的

两种方法比较

第一种主要是使用及阅读不方便。你可以想象一下,当你要调用一个类的构造函数时,你首先要决定使用哪一个,然后里面又是一堆参数,如果这些参数的类型很多又都一样,你还要搞清楚这些参数的含义,很容易就传混了。。。那酸爽谁用谁知道。

第二种方式在构建过程中对象的状态容易发生变化,造成错误。因为那个类中的属性是分步设置的,所以就容易出错。

为了解决这两个问题,builder模式就横空出世了。

bulid模式

  1. 在Product中创建一个静态内部类 Builder,然后将Computer 中的参数都复制到Builder类中。
  2. 在Product中创建一个private的构造函数,参数为Builder类型
  3. 在Builder中创建一个public的构造函数,参数为Product中必填的那些参数,cpu 和ram。
  4. 在Builder中创建设置函数,对Product中那些可选参数进行赋值,返回值为Builder类型的实例
  5. 在Builder中创建一个build()方法,在其中构建Computer的实例并返回
代码实现
@Getter
 class Product {
    private final String productName;
    private final String companyName;
    private final String part1;
    private final String part2;
    private final String part3;
    private final String part4;

    /**
     * 构造方法构造
     * @param productName
     * @param companyName
     * @param part1
     * @param part2
     * @param part3
     * @param part4
     */
    public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
        this.productName = productName;
        this.companyName = companyName;
        this.part1 = part1;
        this.part2 = part2;
        this.part3 = part3;
        this.part4 = part4;
    }

    //静态内部类方式构建
    static class Builder{
        private  String productName;
        private  String companyName;
        private  String part1;
        private  String part2;
        private  String part3;
        private  String part4;

        public Builder setProductName(String productName) {
            this.productName = productName;
            return this;
        }

        public Builder setCompanyName(String companyName) {
            this.companyName = companyName;
            return this;
        }

        public Builder setPart1(String part1) {
            this.part1 = part1;
            return this;
        }

        public Builder setPart2(String part2) {
            this.part2 = part2;
            return this;
        }

        public Builder setPart3(String part3) {
            this.part3 = part3;
            return this;
        }

        public Builder setPart4(String part4) {
            this.part4 = part4;
            return this;
        }
        //build模式把参数赋值给成员变量,把创建对象的权力交给自己
        public Product build(){
           return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
        }
    }
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java建造者设计模式是一种创建对象的设计模式,它可以通过一步一步地构建复杂对象,使得对象的构建过程更加灵活和可控。在建造者模式中,通过定义一个Builder类来设置和构建对象的属性,然后通过调用build方法实例化对象。 建造者设计模式有以下几个优点: 1. 通过建造者模式可以将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 2. 可以通过链式调用的方式设置对象的属性,使得代码更加可读和易于维护。 3. 可以防止对象在实例化之前就被调用,从而避免了对象的不一致性。 4. 解决了JavaBean模式中线程安全问题。 下面是一个示例代码,展示了如何使用Java建造者设计模式: ```java public class User { private String id; private String name; private String password; private String phone; private User(UserBuilder builder) { this.id = builder.id; this.name = builder.name; this.password = builder.password; this.phone = builder.phone; } public String getId() { return id; } public String getName() { return name; } public String getPassword() { return password; } public String getPhone() { return phone; } public static class UserBuilder { private String id; private String name; private String password; private String phone; public UserBuilder setId(String id) { this.id = id; return this; } public UserBuilder setName(String name) { this.name = name; return this; } public UserBuilder setPassword(String password) { this.password = password; return this; } public UserBuilder setPhone(String phone) { this.phone = phone; return this; } public User build() { return new User(this); } } } // 使用建造者模式创建User对象 User user = new User.UserBuilder() .setId("001") .setName("John") .setPassword("123456") .setPhone("1234567890") .build(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值