前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式(四) 建造者模式

设计模式(四) 建造者模式

作者头像
乐百川
发布2022-05-05 20:03:26
2220
发布2022-05-05 20:03:26
举报

建造者模式和工厂模式类似,也是一种创建型模式。它们的主要区别在于:工厂模式需要提供一些信息,而对象在最后一步才创建,而建造者模式则是一步一步的创建对象。

一个非常典型的建造者的例子是Java中的StringBuilder,通过一步一步的添加字符串,最后构造不可变的String对象。

当我们要创建的对象本身内部结构比较复杂,或者当配件的组合非常多的时候,就可以考虑使用建造者模式。

直接看代码吧。首先我们需要一些配件类。在这里是饮料、调料盒主食。

代码语言:javascript
复制
public interface Drink {
    String getInfo();
}

public interface Spice {
    String getInfo();
}

public interface Staple {
    String getInfo();
}

然后是使用这些配件的类,也就是饭菜。一般来说这个类比较复杂,不容易一次性生成。

代码语言:javascript
复制
public class Meal {
    private Drink drink;
    private Spice spice;
    private Staple staple;

    public void setDrink(Drink drink) {
        this.drink = drink;
    }

    public void setSpice(Spice spice) {
        this.spice = spice;
    }

    public void setStaple(Staple staple) {
        this.staple = staple;
    }

    void showMeal() {
        System.out.println(staple.getInfo() + ":" + spice.getInfo() + ":" + drink.getInfo());
    }
}

最后是建造者类,建造者负责一步一步的构造最终的类。

代码语言:javascript
复制
public class MealBuilder {
    private Meal meal;

    public MealBuilder() {
        meal = new Meal();
    }

    public MealBuilder addSpice(Spice spice) {
        meal.setSpice(spice);
        return this;
    }

    public MealBuilder addStaple(Staple staple) {
        meal.setStaple(staple);
        return this;
    }

    public MealBuilder addDrink(Drink drink) {
        meal.setDrink(drink);
        return this;
    }

    public Meal build() {
        return meal;
    }
}

最后我们来使用一下建造者类。这里用lambda表达式简化了一些子类的创建。以后如果需要其他的饭菜组合,也可以非常方便的生成。

代码语言:javascript
复制
MealBuilder builder = new MealBuilder();
builder.addDrink(() -> "啤酒");
builder.addSpice(() -> "辣椒");
builder.addStaple(() -> "炸鸡");
Meal meal = builder.build();
meal.showMeal();
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档