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(); }