【设计模式实践笔记】第三节:建造者模式

建造者模式

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

大多数设计模式都不仅仅存在于IT世界,往往在现实生活中也有相当多的例子,建造者模式也不例外。 builder 的本意是建造者,通常用在建筑领域,小到瓦房单间,大到百米高楼,这些建筑都有一些固定的组成成分,比如墙、屋顶、门和窗等等。建造者们建造一栋房子,只要按照房子的成分,一步一步的添加材料即可。

一般来说我们在代码中使用建造者模式,也是因为有些类有固定的成分,我们不希望暴露过多的实例的创建过程,以此来降低系统维护的复杂程度。创建出来的实例也被称为 表示

使用建造者创建接口通用返回值

先来看一段接口的返回代码:

public class LoginController {

    // 登录
    public Result<String> login(String username, String password) {
        Result<String> result = new Result<>();
        if ("javanote".equalsIgnoreCase(username) && "123456".equalsIgnoreCase(password)) {
            result.setCode(0);
            result.setData("登录成功");
        } else {
            result.setCode(1);
            result.setData("登录失败");
        }
        return result;
    }
}

public class Result<T> {
    private int code;
    private T data;

    // ...省略getter、setter
}

一般我们的接口都是固定格式的返回值,直接 new 一个返回实例出来也跑得通,但是我们有更好的方式来实现,那就是使用建造者模式来创建一个返回实例。

那么如何使用建造者模式来优化我们的代码呢?

按照建造者模式的概念,至少需要两个角色:表示和建造者。表示也就是我们需要创建的对象。

public class ResultBuilder<T> {
    private Result<T> result;

  	// 通过静态方法提供建造者实例
    public static <T> ResultBuilder<T> builder() {
        return new ResultBuilder<>();
    }

  	// 私有构造器,保证建造者实例只能通过自身开放的方法提供出去
    private ResultBuilder() {
        this.result = new Result<>();
    }

    public ResultBuilder code(int code) {
        this.result.setCode(code);
        return this;
    }

    public ResultBuilder data(T data) {
        this.result.setData(data);
        return this;
    }

    public Result<T> build() {
        return this.result;
    }
}

首先我们提供了一个 ResultBuilder 来作为建造者,这里实现的方式有很多种,核心思想是将建造的整个过程委托给建造者角色,这里使用静态方法来简化操作。

如此,优化后的客户端代码如下:

public class LoginController {

    public Result<String> login(String username, String password) {
        if ("javanote".equalsIgnoreCase(username) && "123456".equalsIgnoreCase(password)) {
            return ResultBuilder.<String>builder()
                    .code(0)
                    .data("登录成功")
                    .build();
        }
        return ResultBuilder.<String>builder()
                .code(1)
                .data("登录失败")
                .build();
    }
}

小结

建造者模式是一个非常简单的设计模式,也非常的常用,尤其是在遇到非常之多参数的类要创建实例的时候,可以极大的简化人肉 new 的情况。创建型设计模式本来就是为创建对象服务的,这里如果搭配工厂模式食用,味道更佳。

在实际编程的时候,由于要新增建造者类,所以可能会造成系统整体更复杂,不过不用担心,在实践的过程中有比较多的辅助性开发工具可以帮助我们减轻压力,比如 Lombok 插件中提供的 @Builder 注解可以为一个类创建一建造者,具体的使用方法可以在实践中一探究竟!

实践出真知,让我们一起加油吧!

关注「Java实践笔记」公众号获取全部源代码!

版权声明:本文为公众号「Java实践笔记」的原创文章,转载请联系作者,附上原文出处链接及本声明。
原文链接:https://mp.weixin.qq.com/s/33YfZdDnIFJfDw5wDaa0bA

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值