设计模式-建造者模式

建造者模式

使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
允许用户只通过指定复杂对象的类型和内容就可以构建他们,不需要知道内部的具体构建细节

场景举例

KFC创建套餐:套餐是一个复杂对象,它一般包含汉堡,烤翅,饮料等组成部分,不同的套餐不同的组合,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构成一份完整的套餐。

核心组成

  • Builder : 抽象建造者,定义多个通用方法和构建方法
  • ConcreteBuilder :具体建造者,可以有多个
  • Director:指挥者,控制整个组合过程,将需求交给建造者,由建造者去创建对象
  • Product:产品角色

根据上述场景进行编码实践

/**
 * 汉堡套餐实体类
 */
public class HamburgCombo {

    private String hamburg; // 汉堡包
    private String drinks; // 饮料
    private String chickenwings; // 鸡翅
    private String snaks; // 小吃

    public String getHamburg() {
        return hamburg;
    }

    public void setHamburg(String hamburg) {
        this.hamburg = hamburg;
    }

    public String getDrinks() {
        return drinks;
    }

    public void setDrinks(String drinks) {
        this.drinks = drinks;
    }

    public String getChickenwings() {
        return chickenwings;
    }

    public void setChickenwings(String chickenwings) {
        this.chickenwings = chickenwings;
    }

    public String getSnaks() {
        return snaks;
    }

    public void setSnaks(String snaks) {
        this.snaks = snaks;
    }

    @Override
    public String toString() {
        return "HamburgCombo{" +
                "hamburg='" + hamburg + '\'' +
                ", drinks='" + drinks + '\'' +
                ", chickenwings='" + chickenwings + '\'' +
                ", snaks='" + snaks + '\'' +
                '}';
    }
}
/**
 * 声明建造者的公共方法
 */
public interface Builder {

    void buildHamburg();
    void buildDrinks();
    void buildChickenwings();
    void buildSnaks();

    HamburgCombo createCombo();
}
/**
 * KFC套餐A
 */
public class ComboA implements Builder {

    private HamburgCombo combo = new HamburgCombo();

    @Override
    public void buildHamburg() {
        combo.setHamburg("香辣鸡腿堡");
    }

    @Override
    public void buildDrinks() {
        combo.setDrinks("百事可乐");
    }

    @Override
    public void buildChickenwings() {
        combo.setChickenwings("香辣鸡翅");
    }

    @Override
    public void buildSnaks() {
        combo.setSnaks("薯条");
    }

    @Override
    public HamburgCombo createCombo() {
        return combo;
    }
}

/**
 * KFC套餐B
 */
public class ComboB implements Builder {

    private HamburgCombo combo = new HamburgCombo();
    @Override
    public void buildHamburg() {
        combo.setHamburg("奥尔良鸡腿堡");
    }

    @Override
    public void buildDrinks() {
        combo.setDrinks("雪顶咖啡");
    }

    @Override
    public void buildChickenwings() {
        combo.setChickenwings("奥尔良烤翅");
    }

    @Override
    public void buildSnaks() {
        combo.setSnaks("上校鸡块");
    }

    @Override
    public HamburgCombo createCombo() {
        return combo;
    }
}
/**
* 组装
*/
public class Director {

    public HamburgCombo create(Builder builder) {
        builder.buildHamburg();
        builder.buildDrinks();
        builder.buildChickenwings();
        builder.buildSnaks();
        return builder.createCombo();
    }
}

/**
* 具体实现
*/
Director director = new Director();
HamburgCombo combo = director.create(new ComboA());
System.out.println(combo);

建造者模式优点

  • 客户端不知道产品内部组成的细节,将产品本身与产品的创建过程解耦
  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细的控制产品的创建过程
  • 增加新的具体建造者无需修改原有类库的代码,符合开闭原则
  • 建造者模式组合链式编程使用,代码上更加美观

建造者模式缺点

建造者模式所创建的产品一般具有较多的相同点,如果产品差异大则不建议使用

建造者模式与抽象工厂的比较

建造者模式返回一个组装好的完整产品,抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。

小结

设计模式的创建型模式有单例设计模式,工厂模式,建造者模式,原型模式,到现在讲解了单例设计模式,工厂模式,建造者模式,由于原型模式不常用,就不写相关博客了,可以看看别人的博文,拓展拓展知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值