设计模式入门:建造者模式

UML类图

建造者模式

代码示例

  • Product
/**
 * 表示具体的产品,由多个部件组成
 */
public class Product {

    /**
     * 存放产品每个部件的集合
     */
    private List<String> parts = new LinkedList<>();

    /**
     * 添加某一部件到该集合中
     *
     * @param part
     */
    void addPart(String part) {
        parts.add(part);
    }

    /**
     * 展示产品的部件组成
     */
    void show() {
        parts.forEach(part -> System.out.print(part + "  "));
    }

}
  • Builder
/**
 * 抽象建造者,用于确定产品的组成及获取
 */
public interface Builder {

    /**
     * 部件A
     */
    void partA();

    /**
     * 部件B
     */
    void partB();

    /**
     * 获取产品
     *
     * @return
     */
    Product getProduct();

}
  • BuilderImpl
/**
 * 具体建造者
 */
public class BuilderImpl implements Builder {

    private Product product = new Product();

    @Override
    public void partA() {
        product.addPart("部件A");
    }

    @Override
    public void partB() {
        product.addPart("部件B");
    }

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

}
  • Director
/**
 * 指挥者类(控制建造流程)
 */
public class Director {

    /**
     * 控制并构造所需产品的最终形态
     *
     * @param builder
     */
    void buildProduct(Builder builder) {
        builder.partB();
        builder.partA();
    }

}
  • 测试
public class Main {

    public static void main(String[] args) {
        // 指挥者
        Director director = new Director();
        Builder builder = new BuilderImpl();
        // 指挥者调用所控制的建造过程
        director.buildProduct(builder);

        // 建造完成后返回最终产品
        Product product = builder.getProduct();
        // 调用展示
        product.show();
    }

}

总结思考

  建造者模式中,一些基本部件的实现应该是不怎么变化的,它更关注于指挥者装配并组合部件的过程,对应生活中的KFC,汉堡、可乐、薯条等是不变的,而其组合是经常变化的,演变出各式各样的套餐。

示例代码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

关系型数据库是如何运作的(上)

一说到关系型数据库,我总感觉缺了点什么。如果你尝试透过“关系型数据库是如何运作的”的关键词句来进行搜索,其搜索结果是少量的而且内容是简短的。难道说是由于它已经太...

22380
来自专栏C语言及其他语言

[每日一题]恺撒密码(1214)

这是一个关于凯撒的悲伤的故事。。。。。。 题目描述 恺撒生活在充满危险和阴谋的时代. 恺撒面对的最困难的问题是生存. 为了生存, 他决定创造一种密码. 这种...

32250
来自专栏猿人谷

如何养成良好的c++编程习惯(1)——内存管理

开篇导读   “养成良好的编程习惯”其实是相当综合的一个命题,可以从多个角度、维度和层次进行论述和评判。如代码的风格、效率和可读性;模块设计的灵活 性、可扩展性...

33850
来自专栏ACM算法日常

过山车(匈牙利算法)- HDU 2063

输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000 1<=N 和M<=500.接下来的K行,每行有...

27610
来自专栏牛客网

阿里前端一面

11640
来自专栏不二小段

【爬虫与反爬】记一次网址编码研究

相爱相杀的爬虫与反爬工程师啊……愿你们和谐相处。 前些日子写爬虫时遇到一个比较奇怪的编码,是构造目标网址的一个组成部分,我更倾向于说是编码而不是加密,虽然的确有...

35180
来自专栏达摩兵的技术空间

建造者模式解读

7420
来自专栏葡萄城控件技术团队

Visual Studio 2015速递(1)——C#6.0新特性怎么用

系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS20...

20180
来自专栏YoungGy

ML基石_8_NoiseAndError

recap Noise and Probabilistic Target noise来源 Probabilistic Target Error Measure ...

20350
来自专栏区块链大本营

智能合约中的“高铁座霸”|存储器局部变量未初始化——漏洞分析连载之七

我们在上一期的区块链游戏漏洞的汇总和分析中将目前游戏合约出现的问题与前几期的漏洞连载分析进行了联动,发现游戏合约的漏洞很大一部分是在重复之前代币合约的重大错误。...

8620

扫码关注云+社区

领取腾讯云代金券