JavaBean之Builder模式

https://blog.csdn.net/kangkanglou/article/details/78724240

静态工厂和构造器
重载构造函数,分别包含多个不同的参数

无法很好地扩展到大量的可选参数

JavaBean方式
调用一个无参构造函数来创建对象,然后通过setter方法来设置必要参数

对象构造过程被分割到了几个调用,构造过程中可能导致JavaBean处于不一致的状态,类无法通过检验构造器参数的有效性来保证一致性

Builder模式
不直接生成想要的对象,通过调用构造器(或静态工厂),得到builder对象,客户端在builder对象上调用类似setter方法,来设置每个相关的可选参数,最后,再调用build方法来生成不可变对象

public class Person {
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }

    private String name;
    private String address;
    private String firstName;
    private String lastName;

    private Person(String name, String address, String firstName, String lastName) {
        this.address = address;
        this.name = name;
        this.lastName = lastName;
        this.firstName = firstName;
    }

    public static Builder builder() {
        return new Builder();
    }

    public static class Builder {

        private String name;
        private String address;
        private String firstName;
        private String lastName;

        public Builder name(final String name) {
            this.name = name;
            return this;
        }

        public Builder address(final String address) {
            this.address = address;
            return this;
        }

        public Builder lastName(final String lastName) {
            this.lastName = lastName;
            return this;
        }

        public Builder firstName(final String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Person build() {
            return new Person(name, address, firstName, lastName);
        }
    }
}


客户端调用

Person p = new Person.Builder().address("上海").firstName("三").lastName("张").name("欧阳").build();
        System.out.println(p);
        Person person = Person.builder().address("上海").firstName("三").lastName("张").name("欧阳").build();
        System.out.println(person);


如果我们使用IDE,我们可以直接使用Lombok插件的@Builder注解,仅需声明类属性

@Builder
@ToString
public class LombokPerson {
    private String name;
    private String address;
    private String firstName;
    private String lastName;
}


查看生成的class源码

public class LombokPerson {
    private String name;
    private String address;
    private String firstName;
    private String lastName;

    @ConstructorProperties({"name", "address", "firstName", "lastName"})
    LombokPerson(String name, String address, String firstName, String lastName) {
        this.name = name;
        this.address = address;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public static LombokPerson.LombokPersonBuilder builder() {
        return new LombokPerson.LombokPersonBuilder();
    }

    public String toString() {
        return "LombokPerson(name=" + this.name + ", address=" + this.address + ", firstName=" + this.firstName + ", lastName=" + this.lastName + ")";
    }

    public static class LombokPersonBuilder {
        private String name;
        private String address;
        private String firstName;
        private String lastName;

        LombokPersonBuilder() {
        }

        public LombokPerson.LombokPersonBuilder name(String name) {
            this.name = name;
            return this;
        }

        public LombokPerson.LombokPersonBuilder address(String address) {
            this.address = address;
            return this;
        }

        public LombokPerson.LombokPersonBuilder firstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public LombokPerson.LombokPersonBuilder lastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

        public LombokPerson build() {
            return new LombokPerson(this.name, this.address, this.firstName, this.lastName);
        }

        public String toString() {
            return "LombokPerson.LombokPersonBuilder(name=" + this.name + ", address=" + this.address + ", firstName=" + this.firstName + ", lastName=" + this.lastName + ")";
        }
    }
}


客户端调用:

        LombokPerson lombokPerson = LombokPerson.builder().address("上海").firstName("三").lastName("张").name("欧阳").build();
        System.out.println(lombokPerson);

 

JavaBean是一种Java语言编写的可重用组件,它是一个符合特定规范的Java类,用于在Java应用程序中传递数据。JavaBean的属性通过getter和setter方法来访问和修改。设计模式是一种解决问题的思想,其目的是提高软件的可维护性、可扩展性和可重用性。下面是一些常用的设计模式,可以用来设计JavaBean的实现。 1. 单例模式:保证JavaBean的实例只有一个,可以使用单例模式。 ```java public class MyJavaBean { private static MyJavaBean instance; private MyJavaBean() { // private constructor } public static MyJavaBean getInstance() { if (instance == null) { instance = new MyJavaBean(); } return instance; } // getter and setter methods } ``` 2. 工厂模式:通过工厂方法创建JavaBean的实例,可以使用工厂模式。 ```java public interface JavaBeanFactory { MyJavaBean createJavaBean(); } public class MyJavaBeanFactory implements JavaBeanFactory { @Override public MyJavaBean createJavaBean() { return new MyJavaBean(); } } ``` 3. 建造者模式JavaBean的属性较多时,可以使用建造者模式,通过Builder类创建JavaBean的实例。 ```java public class MyJavaBean { private String name; private int age; private String address; // other properties private MyJavaBean(Builder builder) { this.name = builder.name; this.age = builder.age; this.address = builder.address; // other properties } public static class Builder { private String name; private int age; private String address; // other properties public Builder name(String name) { this.name = name; return this; } public Builder age(int age) { this.age = age; return this; } public Builder address(String address) { this.address = address; return this; } // other builder methods public MyJavaBean build() { return new MyJavaBean(this); } } // getter and setter methods } ``` 4. 观察者模式JavaBean的属性发生变化时,通知观察者,可以使用观察者模式。 ```java public interface Observer { void update(MyJavaBean javaBean); } public class MyJavaBean { private String name; private List<Observer> observers; public void setName(String name) { this.name = name; notifyObservers(); } public void addObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } private void notifyObservers() { for (Observer observer : observers) { observer.update(this); } } // getter and setter methods } ``` 以上是一些常用的设计模式,可以用来设计JavaBean的实现。根据具体需求选择合适的设计模式,可以提高JavaBean的可维护性、可扩展性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值