Java设计模式-生成器模式(建造模式)

1.1定义

维基百科定义
生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式。
它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

简单理解
将一个复杂对象的构建与它的表示分离,使得同样的构建过程,可以创建不同的表示.
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道。

通用流程
先创建一个初始对象,然后逐渐添加新东西,最后调用 build() 方法完成构建。

1.2适用场景

相同的方法,不同的执行顺序,产生不同的事件结果。
对各部件或零件,都可以配到一个对象中,但是产生的运行结果又不相同时。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的结果,这个时候使用创建者模式非常合适。
当初始化一个对象特别复杂,如参数多,且很多参数都有默认值时(一个类有多个构造函数的时候,可以考虑使用建造者模式)
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
需要生成的对象内部属性本身相互依赖

1.3 优缺点

优点
封装性好,创建和使用分离
扩展性好、建造类之间独立、一定程度上解耦
缺点
产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大,所以需要精心设计

建造者模式包含如下角色:

builder(抽象接口) : 为创建一个产品对象的各个部件指定抽象接口。
ConcreteBuilder(抽象接口的具体实现) : 实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
Director(接口的构造者和使用者) : 构造一个使用Builder接口的对象。
Product(被构造的复杂对象) : ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

示例演示

/**
 * @Author charles.yao
 * @Description 户信息(product 产品角色)
 * @Date 2023/2/10 16:22
 */

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
public class UserInfo {
    private String id;
    private String name;
    private String age;
    private String phone;
}


/**
 * @Author charles.yao
 * @Description 用户信息构建抽象类(builder)
 * @Date 2023/2/10 16:25
 */
public abstract class UserBuilder {
    public abstract void buildId(String id);

    public abstract void buildName(String name);

    public abstract void buildAge(String age);

    public abstract void buildPhone(String phone);

    public abstract UserInfo makeUserInfo();

}


/**
 * @Author charles.yao
 * @Description 学生信息构建器(抽象接口的具体实现)
 * @Date 2023/2/10 16:29
 */
public class StudentUserInfoBuilder extends UserBuilder {
    private UserInfo userInfo = new UserInfo();

    public void setUserInfo(UserInfo userInfo) {
        this.userInfo = userInfo;
    }

    @Override
    public void buildId(String id) {
        userInfo.setId(id);
    }

    @Override
    public void buildName(String name) {
        userInfo.setName(name);
    }

    @Override
    public void buildAge(String age) {
        userInfo.setAge(age);
    }

    @Override
    public void buildPhone(String phone) {
        userInfo.setPhone(phone);
    }

    @Override
    public UserInfo makeUserInfo() {
        return userInfo;
    }
}


/**
 * @Author charles.yao
 * @Description 指导建造者建造
 * @Date 2023/2/10 16:35
 */
public class UserInfoDirector {
    private StudentUserInfoBuilder studentUserInfoBuilder;

    public void setStudentUserInfoBuilder(StudentUserInfoBuilder studentUserInfoBuilder) {
        this.studentUserInfoBuilder = studentUserInfoBuilder;
    }

    public UserInfo makeUserInfo(String id, String name, String age, String phone) {
        studentUserInfoBuilder.buildAge(age);
        studentUserInfoBuilder.buildId(id);
        studentUserInfoBuilder.buildName(name);
        studentUserInfoBuilder.buildPhone(phone);
        return studentUserInfoBuilder.makeUserInfo();
    }
}


/**
 * @Author charles.yao
 * @Description 生成器测试类
 * @Date 2023/2/10 16:46
 */
public class BuilderTest {
    public static void main(String[] args) {
        //userInfo 具体创建者
        StudentUserInfoBuilder studentUserInfoBuilder = new StudentUserInfoBuilder();
        //指导创建者
        UserInfoDirector userInfoDirector = new UserInfoDirector();
        userInfoDirector.setStudentUserInfoBuilder(studentUserInfoBuilder);
        //指导创建者生成userInfo
        UserInfo userInfo = userInfoDirector.makeUserInfo("1", "二狗", "20", "110");
        System.out.println("userInfo" + userInfo.toString());
        //===========================

    }
}

猜你喜欢

转载自blog.csdn.net/CharlesYooSky/article/details/128974131