常用设计模式(02)建造者模式

Posted 林枍

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用设计模式(02)建造者模式相关的知识,希望对你有一定的参考价值。

建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

小洪的故事

今日出演:小洪、强哥

这一天刚放学,小洪已经饿到感觉自己已经饿到如鸿毛一样轻,快飘起来了(实际上小洪比泰山还重)。这时候强哥从身后走来,拍了拍小洪的肩膀:“老弟,听说学校门口新开了一家韩国自助烤肉,走!哥请你去吃。”

小洪眼珠子一转:“天下没有免费的午餐啊,老哥你就直说我干嘛吧。”

“哎,你想多了,我只是想今天去试试好不好吃,明天带女朋友去好点菜!”说罢强哥就搂着小洪的肩膀向门外走去,留下小洪的满脸黑线。

自助餐中的建造者

“老板,再来一盘羊肉。“小洪耳朵里听见强哥吆喝着,眼睛却离不开烤炉上滋滋冒油的肉片:“强哥,我等不及了,可以开动了吗?”

“别急别急。烤肉切忌心急”,强哥说:“我们要构建好这一块肉,这样更好吃!你看看这一块肉。”

肉类

public class Meet {
    // 油
    String oil;
    // 调料1,2,3
    String condiment1;
    String condiment2;
    String condiment3;
    // 肉的类型
    String MeetType;
    // 肉的成熟度
    int degree;

    @Override
    public String toString() {
        return "一块" +
                "油是'" + oil + '\'' +
                ", 调料1为'" + condiment1 + '\'' +
                ", 调料2为'" + condiment2 + '\'' +
                ", 调料3为'" + condiment3 + '\'' +
                ", " + degree + "分熟的" +
                 MeetType;
    }

    // 构造方法私有化,防止客户端直接调用构造方法
    private Meet(String oil, String condiment1, String condiment2, String condiment3, String meetType, int degree) {
        this.oil = oil;
        this.condiment1 = condiment1;
        this.condiment2 = condiment2;
        this.condiment3 = condiment3;
        MeetType = meetType;
        this.degree = degree;
    }
}

“强哥,全天下的肉不都是这样的么,不赶快吃饿死了。”小洪感到不解。

“别急,今天这个肉中,还有一个建造者内部类,负责建造这一块肉。”

建造者内部类

// 在Meet类中的静态方法,调用生成肉类
public static MeetBuilder builder(){
    return new MeetBuilder();
}
// 
public static class MeetBuilder{
    String oil;
    String condiment1;
    String condiment2;
    String condiment3;
    String MeetType;
    int degree;

    public MeetBuilder oil(String oil){
        this.oil = oil;
        return this;
    }

    public MeetBuilder condiment1(String condiment1){
        this.condiment1 = condiment1;
        return this;
    }

    public MeetBuilder condiment2(String condiment2){
        this.condiment2 = condiment2;
        return this;
    }

    public MeetBuilder condiment3(String condiment3){
        this.condiment3 = condiment3;
        return this;
    }

    public MeetBuilder MeetType(String meetType){
        this.MeetType = meetType;
        return this;
    }

    public MeetBuilder degree(int degree){
        this.degree = degree;
        return this;
    }

    public Meet build(){
        return new Meet(oil, condiment1, condiment2, condiment3, MeetType, degree);
    }
}

强哥给小洪讲述了构建者类之后,趁着小洪还在懵逼中,马上叫到:“老板,你们这的招牌有什么?”

老板闻声赶来,并介绍到:”我们这里的黑椒胡椒牛排不错,客官你们想要几成熟的啊?“

“七成熟吧。”

“好嘞!”老板马上在我们面前动手做了起来。

客户端调用

public class People {
    public static void main(String[] args) {
        Meet meet = Meet.builder()
                .oil("植物油")
                .MeetType("牛肉")
                .condiment1("香菜")
                .condiment2("胡椒粉")
                .condiment3("黑椒酱")
                .degree(7)
                .build();
        System.out.println(meet);
    }
}

“你瞧,这个招牌合不合你胃口呀?”强哥笑着问小洪。

“可,太可了!”小洪看着手法熟练的老板,哦不是老板手中的肉,说。

运行结果

一块油是'植物油', 调料1为'香菜', 调料2为'胡椒粉', 调料3为'黑椒酱', 7分熟的牛肉

“哇,真的太好吃了!”小洪满意地擦擦嘴,“这个建造器也太好用了吧!省去了很多功夫。”

“其实我们也可以不用建造器,直接手动建造这么一块肉呢!”强哥跃跃欲试。

“怎么做?”小洪用求知和崇拜的目光看着强哥。

“只需要将 Meet 的 set 方法都加上 return this 就可以啦!”强哥说,“接着就像下面一样调用。许多人都是这么用的,只不过还是推荐用建造者方法,毕竟老板比我们都熟练一些。”

Meet meet = new Meet()
        .oil("")
        .MeetType("")
        .condiment1("")
        .condiment2("")
        .condiment3("")
        .degree(10);
System.out.println(meet);

“可能我比较重口味,我想自己做一块芝士、酱油、芥末、六分熟的鸡排,老弟你不要介意。”

“强哥怎么这么说,咱们就不用客气,我就自己做一块用牛油、调料用番茄酱、沙拉酱和大蒜的五分熟羊排好了。”小洪说着自己准备动手。

“五分熟羊排和大蒜,英雄所见略同啊!”有道是酒逢知己千杯少,一顿羊排少不了。

男生的快乐往往就是这么简单、朴实无华。可强哥的女朋友可就未必能体会到了。


以上是关于常用设计模式(02)建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

java常用设计模式四:建造者模式

《设计模式》之建造者模式(Builder)

设计模式——建造者模式

使用建造者模式创建模拟数据

设计模式之建造者模式

设计模式--17建造者模式