浅谈建造者模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


建造者模式


前言

建造者模式用百度百科的解释是:“建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”通俗点讲,建造者模式是根据不同参数生成一个class的不同对象,属于创建型设计模式。

一、为什么要用建造者模式

现在有这样一个场景,需要构建一个复杂对象时,存在多个属性需要初始化,同时,需要对属性的初始值做一些校验。我们首先想到的方法是通过构造函数来初始化对象,并在构造函数中进行相关的逻辑校验,当属性值多个的情况下,构造函数的参数列表会变得很长,代码在可读性和易用性上都会变差。第二种方法是将必须的属性放在构造函数中,其它属性通过set()方法设置,这种方式看起来可行度高,但是当我们希望对象在创建好之后,就不能再修改内部的属性值,那么就不能对外暴露出set()方法。由此引出建造者模式,能够很好地解决上面提到的问题。下面通过一个简单例子来带你理解!

二、建造者模式简单DEMO

1.情景介绍

现在需要创建一个电脑类,电脑里面有cpu、显卡、硬盘、显示器、键盘、鼠标等等属性,并且cpu和显卡、cpu和硬盘之间需要满足一定的匹配性,电脑才能组装成功。这个例子就很适合建造者模式,根据不同参数生成一个class的不同对象。

2.具体代码

public class PcBuildConfig {

    private String name;
    private int cpuFrequence;
    private int gpuFrequence;
    private int diskSize;
    private PcBuildConfig(Builder builder) {
        this.name = builder.name;
        this.cpuFrequence = builder.cpuFrequence;
        this.gpuFrequence = builder.gpuFrequence;
        this.diskSize = builder.diskSize;
    }

    //我们将Builder类设计成了PcBuildConfig的内部类
    public static class Builder {
        private static final int DEFAULT_CPU_FREQUENCE = 8;
        private static final int DEFAULT_GPU_FREQUENCE = 8;
        private static final int DEFAULT_DISK_SIZE = 0;
        private int cpuFrequence = DEFAULT_CPU_FREQUENCE;
        private int gpuFrequence = DEFAULT_GPU_FREQUENCE;
        private int diskSize = DEFAULT_DISK_SIZE;
        private String name;
        public PcBuildConfig build() {
            // 校验逻辑放到这里来做,包括必填项校验、依赖关系校验、约束条件校验等
            // 假设cpu的频率需要大于gpu的频率
            if (cpuFrequence < gpuFrequence) {
                throw new IllegalArgumentException("...");
            }
            // 假设cpu的频率需要大于一定的磁盘容量
            if (cpuFrequence < (diskSize/50)) {
                throw new IllegalArgumentException("...");
            }
            return new PcBuildConfig(this);
        }
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
        public Builder setCpuFrequence(int cpuFrequence) {
            if (cpuFrequence <= 0) {
                throw new IllegalArgumentException("...");
            }
            this.cpuFrequence = cpuFrequence;
            return this;
        }
        public Builder setGpuFrequence(int gpuFrequence) {
            if (gpuFrequence < 0) {
                throw new IllegalArgumentException("...");
            }
            this.gpuFrequence = gpuFrequence;
            return this;
        }
        public Builder setDiskSize(int diskSize) {
            if (diskSize < 0) {
                throw new IllegalArgumentException("...");
            }
            this.diskSize = diskSize;
            return this;
        }
    }

    public static void main(String[] args) {
        PcBuildConfig config = new PcBuildConfig.Builder()
                .setName("我的电脑")
                .setCpuFrequence(16)
                .setGpuFrequence(10)
                .setDiskSize(500)
                .build();
        System.out.println(config.toString());
    }
}

总结

建造者模式主要是用来创建一种类型的复杂对象,可以通过设置不同的可选参数,定制化地创建不同的对象。相比于构造函数或者直接使用set()方法来进行属性赋值,更加高效;但是,如果对象内部变化频繁复杂,则不适合使用建造者模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值