设计模式-生成器模式

不使用生成器模式

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

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);
    }
}
相关推荐
WAsbry2 分钟前
现代 Android 开发自定义主题实战指南
android·kotlin·material design
在未来等你12 分钟前
互联网大厂Java求职面试:AI大模型与云原生技术的深度融合
java·云原生·kubernetes·生成式ai·向量数据库·ai大模型·面试场景
sss191s28 分钟前
Java 集合面试题从数据结构到 HashMap 源码剖析详解及常见考点梳理
java·开发语言·数据结构
LI JS@你猜啊36 分钟前
window安装docker
java·spring cloud·eureka
xzkyd outpaper40 分钟前
Android动态广播注册收发原理
android·计算机八股
唐墨1231 小时前
android与Qt类比
android·开发语言·qt
书中自有妍如玉1 小时前
.net 使用MQTT订阅消息
java·前端·.net
风铃儿~1 小时前
Spring AI 入门:Java 开发者的生成式 AI 实践之路
java·人工智能·spring
斯普信专业组1 小时前
Tomcat全方位监控实施方案指南
java·tomcat
林林要一直努力1 小时前
Android Studio 向模拟器手机添加照片、视频、音乐
android·智能手机·android studio