博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最简单易懂的设计模式——建造者模式
阅读量:4078 次
发布时间:2019-05-25

本文共 2997 字,大约阅读时间需要 9 分钟。

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

建造者模式

定义

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

实现方式

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

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、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

转载地址:http://izsni.baihongyu.com/

你可能感兴趣的文章
Android中AsyncTask的简单用法
查看>>
Jenkins 启动命令
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
剑指offer算法题分析与整理(三)
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
QT打开项目提示no valid settings file could be found
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
Encoding Schemes
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>