设计模式第二章——建造者模式
建造者模式
将复杂对象的构造与其表示分离,以便同⼀构造过程可以创建不同的表示。翻译一下就是。大厨出餐只需要把配菜师备好的食材按照规定的流程倒入锅中,出锅就是不同的美食。参考示例代码
建造者模式主要包含四个⻆⾊。
Product:代表最终构建的对象,⽐如,宫保鸡丁、鱼香肉丝。
Builder:代表建造者的抽象基类。它定义了午餐需要哪些食材,需要烹饪多长时间 也就是配菜师的抽象类。它的⼦类(或接⼝实现类)需要实现这些步骤。同时,它还需要包含⼀个⽤来返回最终对象的⽅法 getProduct()。
ConcreteBuilder:代表 Builder 类的具体实现类。这个类就是配菜师的具体实现类。配菜师具体备了哪些菜。例如宫保鸡丁的配菜、鱼香肉丝的配菜。
Director:代表需要建造最终对象的某种算法。这里规定了厨师要按照什么流程做中午饭。等创建完成后,再通过 getProduct() ⽅法来获取最终的完整对象
下面看一下代码
@Data public class Lunch { /* * 名称 */ private String name; /* * 食材 */ private String food; /* * 烹饪时常 */ private Long time; }
Lunch这个类就是我们的产品,可以是宫保鸡丁,也可以是鱼香肉丝。客人点餐之后我们上菜的时候肯定是个成品。
大厨做菜之后配菜师需要把需要用到的东西全部准备好。为了规范配菜师的行为,抽象出配菜师的行为接口
public interface LunchBuild { void buildName(); void buildFood(); void buildTime(); Lunch buildLunch(); }
行为规定了之后就要配菜师按照接口的行为规范备菜了。
客人点的是宫保鸡丁和鱼香肉丝
public class GongbaoJiDing implements LunchBuild{ private Lunch lunch = new Lunch(); @Override public void buildName() { lunch.setName("宫保鸡丁"); } @Override public void buildFood() { lunch.setFood("鸡腿肉、葱姜蒜、豆瓣酱、花生、白糖"); } @Override public void buildTime() { lunch.setTime(15L); } @Override public Lunch buildLunch() { return lunch; } }
宫保鸡丁的菜就备好了,接下来是鱼香肉丝的备菜
public class Yuxiangrousi implements LunchBuild{ private Lunch lunch = new Lunch(); @Override public void buildName() { lunch.setName("鱼香肉丝"); } @Override public void buildFood() { lunch.setFood("里脊肉、萝卜丝、蒜苔、木耳丝"); } @Override public void buildTime() { lunch.setTime(10L); } @Override public Lunch buildLunch() { return lunch; } }
两个菜都备好了,大厨要开始出菜了。配菜师把备好的菜传给大厨,大厨按照炒菜流程完成出餐
public class Cook { private LunchBuild lunchBuild; public Cook(LunchBuild lunchBuild) { this.lunchBuild = lunchBuild; } public Lunch accomplish(){ lunchBuild.buildName(); lunchBuild.buildFood(); lunchBuild.buildTime(); return lunchBuild.buildLunch(); } }
以上的流程是后厨的流程,客人看到的可不是这样的。接下来的代码是客人看到的
public static void main(String[] args) { //大厨做饭的时候都会有助手准备好食材。厨师今天准备做宫保鸡丁和鱼香肉丝。 //助手开始准备食材 GongbaoJiDing gongbaoJiDing = new GongbaoJiDing(); Yuxiangrousi yuxiangrousi = new Yuxiangrousi(); //食材准备完毕,大厨开始做菜 Cook cookG = new Cook(gongbaoJiDing); //第一道菜宫保鸡丁 Lunch g = cookG.accomplish(); System.out.println(g); //第二道菜鱼香肉丝 Cook cookY = new Cook(yuxiangrousi); Lunch y = cookY.accomplish(); System.out.println(y); }
上菜吃就完了

浙公网安备 33010602011771号