设计模式之:构造器模式

业务场景

构造一个复杂的对象,很多的属性,有些属性构造的时候需要做一些校验,格式转换

常见于在构建一个复杂的对象,或者是构建一个复杂的表达式的时候,在开源框架中有大量广泛的运用

在Mockito框架中,when().thenReturn()之类的,其实就是构造器模式的一种,通过多个连续的方法完成一个模拟对象的构建

还有就是spring test框架汇总,MvcMock对象,也是通过thenExpected()等多个连续的方法,完成一个mvc测试对象的构建

用构造器模式的最大好处是啥?

复杂对象的构建过程太复杂了,里面可能包含一些业务逻辑,比如值检查,格式转换之类的

如果每个客户端都自己手动去完成构建的话,那么大量的冗余代码是一个

另外一个,如果我们要改变对象的构建过程的实现,可以就在构造器中一个地方修改即可,对于调用方完全透明;

最后,如果我们要完全替换掉以前的builder实现的话,那么完全可以在工厂里替换一个实现,还跟简单工厂模式结合起来使用了

public class OptimizedBuilderPatternDemo {

    public static void main(String[] args) {
        Product product = new ConcreteBuilder()
                .field1("值1")
                .field2("值2")
                .field3("值3")
                .create();
        System.out.println(product);

        // 现在基本上流行的一些开源框架,构造器模式的运用,一般都是上面这种变种模式
    }

    public static class Product {

        private String field1;
        private String field2;
        private String field3;

        public String getField1() {
            return field1;
        }

        public void setField1(String field1) {
            this.field1 = field1;
        }

        public String getField2() {
            return field2;
        }

        public void setField2(String field2) {
            this.field2 = field2;
        }

        public String getField3() {
            return field3;
        }

        public void setField3(String field3) {
            this.field3 = field3;
        }

        @Override
        public String toString() {
            return "Product [field1=" + field1 + ", field2=" + field2 + ", field3=" + field3 + "]";
        }

    }

    public interface Builder {

        Builder field1(String value);

        Builder field2(String value);

        Builder field3(String value);

        Product create();

    }

    public static class ConcreteBuilder implements Builder {

        private Product product = new Product();

        @Override
        public Builder field1(String value) {
            System.out.println("在设置field1之前进行复杂的校验逻辑");
            product.setField1(value);
            return this;
        }

        @Override
        public Builder field2(String value) {
            System.out.println("在设置field2之前进行复杂的数据格式转化逻辑");
            product.setField2(value);
            return this;
        }

        @Override
        public Builder field3(String value) {
            System.out.println("在设置field3之前进行复杂的数据处理逻辑,跟其他对象的数据进行关联");
            product.setField3(value);
            return this;
        }

        @Override
        public Product create() {
            return product;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值