IT铁人DAY 11-Builder 建立者模式

  一看到Builder就知道它是属於Creational Pattern,那它可以用来解决什麽问题呢?现在就来认识一下Builder这个模式吧!


问题情境与解析

  以火锅作为例子,简单的火锅可以分成汤底、菜盘和肉盘,如果要更精致的话可以加些不一样的火锅料、多一些沾酱、甚至是更高级的料理等等。一个简单的火锅物件就可能会需要这些元素,而这些元素就代表着创建一个物件所需要带入的参数,不过并不是所有的火锅都会需要用到所有的参数,没用到的参数就显得非常多余,程序码看起来就会非常冗赘。

  而Builder就会让一个火锅元素编成一个步骤,例如addMeat()、addVeg()等,并让每一种建立火锅的物件来执行这一系列的步骤。而某些步骤你可能会需要不同的变化,比方说肉盘你可以选择要牛肉、猪肉或鸡肉等等,这样的情况你会需要创建不同建立火锅的物件,它们去实现相同的步骤,不过方式不同,如此一来就可以生成不一样的火锅物件。

  接着可以更进一步创建一个Director类别,并定义执行建立火锅步骤的顺序,再让建立火锅的物件来实现步骤。

  这样,Director类别可以对客户端完全隐藏建立火锅的细节,而客户只需要与Director类别及Builder做关联,使用Director物件建构,再从Builder获得结果就可以罗!

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210926/201407432v46spDLgT.png

Skeleton Code

interface Builder {
    void buildStepA();
    void buildStepB();
    void buildStepC();
	ProductA getProduct();
}

class BuilderA implements Builder {
    public void buildStepA() {
        // StepA For ProductA
    }
    public void buildStepB() {
        // StepB For ProductA
    }
    public void buildStepC() {
        // StepC For ProductA
    }
    public ProductA getProduct() {
        return new ProductA();
    }
}

class BuilderB implements Builder {
    public void buildStepA() {
        // StepA For ProductB
    }
    public void buildStepB() {
        // StepB For ProductB
    }
    public void buildStepC() {
        // StepC For ProductB
    }
    public ProductB getProduct() {
        return new ProductB();
    }
}

class Director {
    private Builder builder;
    
    public Director(Builder builder) {
        this.builder = builder;
    }
    
    public void makeProduct(Type type) {
        if (type) {
            builder.buildStepA();
        } else {
            builder.buildStepB();
            builder.buildStepC();
        }
    }
}

  使用Builder就可以恣意安排建构的步骤,且这些步骤都具有重用性,方便调用。之後碰到生成某项产品需要许多参数或是某产品创建时可以用不同种方式实现(如猪肉锅、牛肉锅),就可以使用Builder来解决问题了!


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day11

>>:  Day 11 : 案例分享(3.4) 会计模组-分析会计与资产折旧

【DAY 16】关於微软生产力平台 Microsoft Power Platform

哈罗大家好~ 在此之前,关於 Microsoft 365 提升生产力的提案,主要着重在比较好入手的应...

Day18 CSS网页开始写前的准备

学到这里,我们差不多可以开始着手做出一个简单的网页了! 但是在这之前我们需要link一个CSS档案,...

Day3 - numpy(2) 基本索引

今天的重点 索引 基本索引: 先建立一个4x3的ndarray来让我们实际操作 阵列索引是由外而内的...

【RPA介绍】如何用UiPath Studio把重复性流程自动跑起来!

一、RPA是什麽? RPA 是 Robotic Process Automation的缩写,简称机器...