设计模式-生成器模式

不使用生成器模式

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

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);
    }
}
相关推荐
风起云涌~10 小时前
【Android】kotlin.flow简介
android·开发语言·kotlin
深海呐10 小时前
Android 协程的基本使用和最简要原理概述
android·协程·android 协程·协程的原理
龙茶清欢10 小时前
1、Lombok入门与环境配置:理解Lombok作用、配置IDE与构建工具
java·spring boot·spring cloud
龙茶清欢10 小时前
2、Nginx 与 Spring Cloud Gateway 详细对比:定位、场景与分工
java·运维·spring boot·nginx·spring cloud·gateway
Eoch7710 小时前
HashMap夺命十连问,你能撑到第几轮?
java·后端
云动雨颤10 小时前
程序出错瞎找?教你写“会说话”的错误日志,秒定位原因
java·运维·php
魔芋红茶10 小时前
RuoYi 学习笔记 3:二次开发
java·笔记·学习
杨杨杨大侠10 小时前
Atlas Mapper 教程系列 (8/10):性能优化与最佳实践
java·spring boot·spring·性能优化·架构·系统架构
yinke小琪10 小时前
线程池七宗罪:你以为的优化其实是在埋雷
java·后端·面试
-雷阵雨-11 小时前
数据结构——包装类&&泛型
java·开发语言·数据结构·intellij-idea