设计模式-生成器模式

不使用生成器模式

如果不使用生成器模式,当一个类的构造函数有多个可选参数时,可能会导致构造函数的参数列表非常长,而且在创建对象时需要传递大量的参数,这不仅使得代码难以阅读和维护,还可能因为参数顺序错误而导致错误

java 复制代码
public class Phone {
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    // 构造函数有多个参数
    public Phone(String cpu, String screen, String memory, String mainboard) {
        this.cpu = cpu;
        this.screen = screen;
        this.memory = memory;
        this.mainboard = mainboard;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }
}

public class Client {
    public static void main(String[] args) {
        // 创建Phone对象时需要传递所有参数
        Phone phone = new Phone("Intel Core i7", "13.3 inch", "16GB", "Intel HM");
        System.out.println(phone);
    }
}

使用生成器模式

在这个例子中,Phone 类是需要构建的复杂对象,它有多个可选的属性,如 CPU、屏幕、内存和主板等。

通过使用生成器模式,我们创建了一个 Builder 类来逐步设置这些属性,最后调用 build() 方法生成最终的手机对象。

这样,用户可以根据自己的需求灵活地选择不同的配置来构建手机,而不需要在构造函数中处理大量的参数。

java 复制代码
public class Phone {
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    private Phone(Builder builder) {
        this.cpu = builder.cpu;
        this.screen = builder.screen;
        this.memory = builder.memory;
        this.mainboard = builder.mainboard;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }

    public static class Builder {
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;

        public Builder cpu(String val) {
            cpu = val;
            return this;
        }

        public Builder screen(String val) {
            screen = val;
            return this;
        }

        public Builder memory(String val) {
            memory = val;
            return this;
        }

        public Builder mainboard(String val) {
            mainboard = val;
            return this;
        }

        public Phone build() {
            return new Phone(this);
        }
    }
}

客户端代码

java 复制代码
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone.Builder()
                .cpu("Intel Core i7")
                .memory("16GB")
                .screen("13.3 inch")
                .mainboard("Intel HM")
                .build();

        System.out.println(phone);
    }
}
相关推荐
蝸牛ちゃん21 分钟前
设计模式(七)结构型:适配器模式详解
设计模式·系统架构·软考高级·适配器模式
微笑听雨25 分钟前
Java 设计模式之单例模式(详细解析)
java·后端
微笑听雨25 分钟前
【Drools】(二)基于业务需求动态生成 DRL 规则文件:事实与动作定义详解
java·后端
猫猫的小茶馆43 分钟前
【STM32】FreeRTOS 任务的删除(三)
java·linux·stm32·单片机·嵌入式硬件·mcu·51单片机
天天摸鱼的java工程师1 小时前
🔧 MySQL 索引的设计原则有哪些?【原理 + 业务场景实战】
java·后端·面试
空影学Java1 小时前
Day44 Java数组08 冒泡排序
java
消失的旧时光-19431 小时前
Android网络框架封装 ---> Retrofit + OkHttp + 协程 + LiveData + 断点续传 + 多线程下载 + 进度框交互
android·网络·retrofit
蝸牛ちゃん1 小时前
设计模式(十二)结构型:享元模式详解
设计模式·系统架构·软考高级·享元模式
追风少年浪子彦2 小时前
mybatis-plus实体类主键生成策略
java·数据库·spring·mybatis·mybatis-plus