最简单易懂的设计模式——建造者模式

最简单易懂的设计模式之建造者模式

建造者模式

定义

建造型模式用于创建过程稳定,但配置多变的对象。定义是:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示

实现方式

经典的「建造者-指挥者」模式现在已经不太常用了,现在建造者模式主要用来通过链式调用生成不同的配置。比如我们要制作一杯奶茶。它的制作过程是稳定的,除了必须要知道奶茶的种类和规格外,是否加珍珠和是否加冰是可选的。使用建造者模式代码如下:

public class MilkTea {
        private final String type;
        private final String size;
        private final boolean pearl;
        private final boolean ice;

        private MilkTea(Builder builder) {
            this.type = builder.type;
            this.size = builder.size;
            this.pearl = builder.pearl;
            this.ice = builder.ice;
        }

        public String getType() {
            return type;
        }

        public String getSize() {
            return size;
        }

        public boolean isPearl() {
            return pearl;
        }

        public boolean isIce() {
            return ice;
        }

        public static class Builder {

            private final String type;
            private String size = "中杯";
            private boolean pearl = true;
            private boolean ice = false;

            public Builder(String type) {
                this.type = type;
            }

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

            public Builder pearl(boolean pearl) {
                this.pearl = pearl;
                return this;
            }

            public Builder ice(boolean cold) {
                this.ice = cold;
                return this;
            }

            public MilkTea build() {
                return new MilkTea(this);
            }
        }
}

我们将 MilkTea 的构造方法设置为私有的,所以外部不能通过 new 构建出 MilkTea 实例,只能通过 Builder 构建。对于必须配置的属性,通过 Builder 的构造方法传入,可选的属性通过 Builder 的链式调用方法传入,如果不配置,将使用默认配置。根据不同的配置可以制作出不同的奶茶,实现代码如下:

public class User {
        private void buyMilkTea() {
            MilkTea milkTea = new MilkTea.Builder("原味").build();
            show(milkTea);
            MilkTea chocolate = new MilkTea.Builder("巧克力味")
                    .ice(false)
                    .build();
            show(chocolate);
            MilkTea strawberry = new MilkTea.Builder("草莓味")
                    .size("大杯")
                    .pearl(false)
                    .ice(true)
                    .build();

            show(strawberry);
        }

        private void show(MilkTea milkTea) {

            String pearl;
            if (milkTea.isPearl()) {
                pearl = "加珍珠";
            } else {
                pearl = "不加珍珠";
            }
            String ice;
            if (milkTea.isIce()) {
                ice = "加冰";
            } else {
                ice = "不加冰";
            }
            System.out.println("一份" + milkTea.getSize() + "、"
                    + pearl + "、"
                    + ice + "的"
                    + milkTea.getType() + "奶茶");
        }
}

优点

1、使用建造者模式可以使使用者不必知道产品内部组成的细节。
2、具体的建造者类之间是相互独立的,这有利于系统的扩展。
3、具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生影响。

缺点

1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值