设计模式-生成器模式

不使用生成器模式

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

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);
    }
}
相关推荐
音符犹如代码6 小时前
Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题
java·开发语言·面试·list
代码or搬砖7 小时前
Docker 部署 Java 项目实践
java·docker·容器
又是忙碌的一天7 小时前
抽象类和接口
java·开发语言
August_._7 小时前
【MySQL】SQL语法详细总结
java·数据库·后端·sql·mysql·oracle
stevenzqzq7 小时前
android lambda回调
android
Dxxyyyy7 小时前
零基础学JAVA--Day26(枚举类)
java·开发语言
黑屋里的马7 小时前
java的设计模式之桥接模式(Bridge)
java·算法·桥接模式
升鲜宝供应链及收银系统源代码服务7 小时前
升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
java·开发语言·数据库·redis·缓存·开源·供应链系统
练习时长一年7 小时前
Spring AoP的切点匹配
java·开发语言
27669582928 小时前
朴朴超市小程序分析
java·python·小程序·node·sign·朴朴超市·sign-v2