设计模式-生成器模式

不使用生成器模式

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

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);
    }
}
相关推荐
程序员Android3 分钟前
Android 相机MFNR 拍照trace 分析
android·数码相机
不想看见4044 分钟前
Min Stack栈和队列--力扣101算法题解笔记
java·笔记·leetcode
2501_915918414 分钟前
基于Mach-O文件的动态库与静态库归属方案及API扫描实践
android·ios·小程序·https·uni-app·iphone·webview
踏雪羽翼4 分钟前
android 实现google 订阅支付
android·支付·订阅·google订阅·谷歌支付
马猴烧酒.5 分钟前
【面试八股|计算机网络】计算机网络常见面试题详解笔记
java·开发语言·网络·笔记·计算机网络·算法·面试
千码君20166 分钟前
kotlin:函数式参数
java·算法·kotlin
2501_915106327 分钟前
iOS 证书无法跨电脑使用?签名迁移方法一文讲透
android·ios·小程序·https·uni-app·iphone·webview
Kapaseker11 分钟前
Window 内外藏机巧 旧岗新页见真章
android·kotlin
西门吹雪分身11 分钟前
JMM java内存模型分析
java·开发语言
Yu_Lijing11 分钟前
基于C++的《Head First设计模式》笔记——蝇量模式
c++·笔记·设计模式