设计模式 创建者模式 -- 建造者模式扩展: 链式编程(解决构造函数参数列表过长的可读性问题)

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 创建者模式 -- 建造者模式扩展: 链式编程(解决构造函数参数列表过长的可读性问题)相关的知识,希望对你有一定的参考价值。

建造者模式


1. 模式扩展: 链式编程

建造者模式在开发中还有一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会非常差,而且很容易引入错误,此时就可以利用建造者模式进行重构。


1.1 重构前的代码


1.1.1 Phone 手机类

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;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getScreen() {
        return screen;
    }

    public void setScreen(String screen) {
        this.screen = screen;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getMainboard() {
        return mainboard;
    }

    public void setMainboard(String mainboard) {
        this.mainboard = mainboard;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\\'' +
                ", screen='" + screen + '\\'' +
                ", memory='" + memory + '\\'' +
                ", mainboard='" + mainboard + '\\'' +
                '}';
    }
}

1.1.2 Client 客户端类

public class Client {
    //构建Phone对象
    Phone phone = new Phone("intel", "三星屏幕", "金士顿", "华硕");
    System.out.println(phone);
}

1.1.3 问题分析

上面在客户端代码中构建Phone对象,传递了四个参数,如果参数更多呢?代码的可读性及使用的成本就是比较高。


1.2 重构后代码


1.2.1 Phone 手机类

package com.tian.pattern.builder.demo2;


/**
 * @Description: 手机类
 */
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 final class Builder {
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;

        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder screen(String screen) {
            this.screen = screen;
            return this;
        }
        public Builder memory(String memory) {
            this.memory = memory;
            return this;
        }
        public Builder mainboard(String mainboard) {
            this.mainboard = mainboard;
            return this;
        }

        //使用构建者创建Phone对象
        public Phone build() {
            return new Phone(this);
        }
    }
}

1.2.2 Client 客户端类

package com.tian.pattern.builder.demo2;

/**
 * 客户端类
 */
public class Client {
    public static void main(String[] args) {
        //创建手机对象   通过构建者对象获取手机对象
        Phone phone = new Phone.Builder()
                .setCpu("intel")
                .setScreen("三星屏幕")
                .setMemory("金士顿内存条")
                .setMainboard("华硕主板")
                .build();

        System.out.println(phone);
    }
}

1.2.3 运行结果


1.2.4 说明

重构后的代码在使用起来更方便,某种程度上也可以提高开发效率。从软件设计上,对程序员的要求比较高。



以上是关于设计模式 创建者模式 -- 建造者模式扩展: 链式编程(解决构造函数参数列表过长的可读性问题)的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式遇到大数据SparkSession,使链式函数编程再次流行

从ES6重新认识JavaScript设计模式: 建造者模式

创建型模式(建造者模式)

建造者模式

《源码中的设计模式》之建造者模式——链式调用

设计模式 创建者模式 -- 建造者模式扩展: 指挥者类的深入探究(钩子函数引入)& 创建者模式对比