23种设计模式_MODE06建造者模式_手写代码实现

简介: 23种设计模式_MODE06建造者模式_手写代码实现

1. 建造者模式测试 == 客户购买蛋糕

package com.zhaoshuangjian.mode06_建造者模式;
import com.zhaoshuangjian.mode06_建造者模式.mode06.Cake;
import com.zhaoshuangjian.mode06_建造者模式.mode06.CakeMaker;
import com.zhaoshuangjian.mode06_建造者模式.mode06.CakeSeller;
/**
 * <p>建造者模式测试 == 客户购买蛋糕</p>
 *
 * @Author zhaoshuangjian  2023-03-24 下午10:39
 */
public class BuilderTest {
    /**
     * 1、假设我要去蛋糕店买蛋糕,我只需要付钱,蛋糕销售员给我一个蛋糕即可
     * 2、作为购买者,我不关心我买到的蛋糕是怎么制作出来的,即我只关心显示【蛋糕】,不关心行为【制作蛋糕】
     * 3、而蛋糕肯定是按照一定的制作工序才能制作出来的,谁会这种制作工序呢?答案肯定是蛋糕制作师傅了
     * 4、话又说回来,蛋糕师傅只会制作蛋糕,他并不关心蛋糕的去向
     * 5、但是客户又要买蛋糕,所以最后还是会绕到销售员的身上
     * 6、即 -- 蛋糕制作师傅  --> 蛋糕销售员 --> 蛋糕购买者
     *
     * 接下来,我们来实现一下
     */
    public static void main(String[] args) {
        /**
         * 先指定一个蛋糕师傅  == 李师傅
         */
        CakeMaker cakeMaker = new CakeMaker("李师傅");
        /**
         * 指定蛋糕销售员
         */
        CakeSeller cakeSeller = new CakeSeller();
        /**
         * 销售员卖个客户一个蛋糕 == 注意,这个蛋糕的制作工程已经被隐藏了
         */
        Cake cake = cakeSeller.sell(cakeMaker);
        /**
         * 这一句其实没必要显示,这里显示是为了说明,蛋糕不是平白无故的创造出来的
         */
        cake.show();
        /**
         * Product: 具体产品【本案例中☞Cake】
         * Builder: 创建一个Product对象的各个部分指定的抽象接口【本案例中☞CakeBuilder】
         * ConcreteBuilder:具体的建造者,实现Builder接口,构建和装配各个部件【本案例中☞CakeMaker】
         * Director: 构建一个使用builder接口的对象【本案例中☞CakeSeller】
         * 场景:创建一些复杂的对象,这些对象内部构建之间的建造顺序是稳定的,但是对象内部的构建通常面临着复杂的变化
         * 好处:建造代码与表示代码分离,隐藏了该产品是如何组装的,
         *       若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了 == 这个就非常很了
         */
    }
}

2. 蛋糕师 == 根据builder定义的制作工序制作蛋糕

package com.zhaoshuangjian.mode06_建造者模式.mode06;
/**
 * <p>蛋糕师 == 根据builder定义的制作工序制作蛋糕</p>
 *
 * @Author zhaoshuangjian  2023-03-24 下午10:39
 */
public class CakeMaker implements  CakeBuilder{
    /**
     * 蛋糕师傅的姓名
     */
    private String name ;
    /**
     * 蛋糕师要制作的蛋糕,蛋糕师不关心蛋糕最后去了哪,他只需要把做好的蛋糕放在货架上即可
     */
    private Cake cake = new Cake();
    public  CakeMaker(){
    }
    public  CakeMaker(String name){
        this.name = name;
    }
    /**
   * @return the name
   */
  public String getName() {
    return name;
  }
  /**
   * @param name the name to set
   */
  public void setName(String name) {
    this.name = name;
  }
  /**
   * @param cake the cake to set
   */
  public void setCake(Cake cake) {
    this.cake = cake;
  }
  @Override
    public void knead() {
       cake.addProcess("揉面 -- 软软的,滑滑的");
    }
    @Override
    public void ferment() {
        cake.addProcess("发酵 -- 酵一酵");
    }
    @Override
    public void bake(int minutes) {
        cake.addProcess("烘烤 -- "+minutes+"分钟");
    }
    @Override
    public Cake getCake() {
        return this.cake;
    }
}

3. 蛋糕销售者 == 告诉蛋糕师,货架上没蛋糕了,赶紧给我做一个出来,客户等着要呢

package com.zhaoshuangjian.mode06_建造者模式.mode06;
/**
 * <p>蛋糕销售者 == 告诉蛋糕师,货架上没蛋糕了,赶紧给我做一个出来,客户等着要呢</p>
 *
 * @Author zhaoshuangjian  2023-03-24 下午10:39
 */
public class CakeSeller {
    public  CakeSeller(){
    }
    public  Cake  sell(CakeBuilder cakeBuilder){
        cakeBuilder.knead();
        cakeBuilder.ferment();
        cakeBuilder.bake(30);
        return  cakeBuilder.getCake();
    }
}

4. 蛋糕类

package com.zhaoshuangjian.mode06_建造者模式.mode06;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>蛋糕类</p>
 *
 * @Author zhaoshuangjian  2023-03-24 下午10:39
 */
public class Cake {
    /**
     * 制作一个蛋糕所需要的所有工序【或一个产品所有组成部分的实现】
     */
    private List<String> parts = new ArrayList<>();
    public Cake(){}
    public List<String> getParts() {
        return parts;
    }
    public void setParts(List<String> parts) {
        this.parts = parts;
    }
    public void addProcess(String process){
        this.parts.add(process);
    }
    public void show(){
        System.out.println("先生你好,香喷喷的蛋糕已为你准备好了,它的制作流程如下:");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}

5. 蛋糕制作器接口,规定制作流程,具体实现过程取决于builder的人

package com.zhaoshuangjian.mode06_建造者模式.mode06;
/**
 * <p>蛋糕制作器接口,规定制作流程,具体实现过程取决于builder的人</p>
 * <p>除了定义制作流程【工序】外,还需要定义一个根据流程制作好的蛋糕【获取产品】</p>
 *
 * @Author zhaoshuangjian  2023-03-24 下午10:39
 */
public interface CakeBuilder {
    /**
     * 揉面
     */
    void  knead();
    /**
     * 发酵
     */
    void  ferment();
    /**
     * 烘烤
     * @param minutes 烘烤的分钟数
     */
    void bake(int minutes);
    /**
     * 返回builder后的产品、结果  == 即行为和展示分离,你怎么制作的我不关心,我关心的是,什么时候能让我吃上蛋糕,哈哈
     * @return
     */
    Cake getCake();
}
相关文章
|
11天前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
109 1
|
11天前
|
设计模式 uml
【设计模式】建造者模式就是游戏模式吗?
【设计模式】建造者模式就是游戏模式吗?
15 0
|
11天前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
12 1
大话设计模式(3)——造物者一般的建造者模式
|
11天前
|
设计模式 前端开发 API
写出易维护的代码|React开发的设计模式及原则
本文对React社区里出现过的一些设计模式进行了介绍,并讲解了他们遵循的设计原则。
|
11天前
|
设计模式 JavaScript 前端开发
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
|
11天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
11天前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~建造者模式
[设计模式 Go实现] 创建型~建造者模式
|
11天前
|
设计模式 Java
小谈设计模式(14)—建造者模式
小谈设计模式(14)—建造者模式
|
11天前
|
设计模式 算法 Java
23种设计模式,访问者模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】访问者模式是一种将算法与对象结构分离的设计模式。这种模式主要用于执行一个操作(或一组操作)在一个对象结构的各元素上,它可以在不修改各元素的类的前提下定义新的操作。
24 2
|
11天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
20 0