设计模式第二章——建造者模式

建造者模式

将复杂对象的构造与其表示分离,以便同⼀构造过程可以创建不同的表示。翻译一下就是。大厨出餐只需要把配菜师备好的食材按照规定的流程倒入锅中,出锅就是不同的美食。参考示例代码
建造者模式主要包含四个⻆⾊。
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);
    }

上菜吃就完了



posted @ 2024-02-22 06:08  百思得其姐  阅读(11)  评论(0)    收藏  举报