Builder(建造者模式)

来源:互联网 发布:ubuntu查看gpu 编辑:程序博客网 时间:2024/06/06 00:10

Builder(建造者模式)

概述

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。 该 Builder 类是独立于其他对象的。

主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成; 由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

使用

示例

我们的辣条销售异常火爆,但是辣条厂由于经营不善濒临倒闭,我们不能让辣条厂倒闭啊,没有了辣条以后就没有生意做了,影响我们以后上市啊。 索性就把辣条厂收购了,我们自己来管理。 收购了辣条厂发现之前的辣条种类很多,但是口味单一,现在需要拓展不同口味的辣条来满足更多的人群。

实现

  1. 首先调整下之前的辣条类
public interface HotStrip {    String getType();//保存辣条的种类信息}
  1. 现有的辣条种类
public class KissHotStrip implements HotStrip {    @Override    public String getType() {        return "这是亲嘴烧!";    }}
public class BigHotStrip implements HotStrip {    @Override    public String getType() {        return "这是大面筋!";    }}
  1. 创建不同味道的辣条
public interface Taste {    String getTaste();}
public class SaltyHotStrip implements Taste {    @Override    public String getTaste() {        return "咸味儿的";    }}
public class SweetHotStrip implements Taste {    @Override    public String getTaste() {        return "甜味儿的";    }}
  1. 创建一个有分类带味道的辣条
public class TasteHotStrip {    private HotStrip type;    private Taste taste;//味道    public HotStrip getType() {        return type;    }    public void setType(HotStrip type) {        this.type = type;    }    public Taste getTaste() {        return taste;    }    public void setTaste(Taste taste) {        this.taste = taste;    }}
  1. 创建一台可以生产不同味道辣条的机器
public interface Builder {    void buildType(HotStrip type);    void buildTaste(Taste taste);    TasteHotStrip create();}
public class TasteHotStripBuilder implements Builder {    private TasteHotStrip tasteHotStrip = new TasteHotStrip();    @Override    public void buildType(HotStrip type) {        tasteHotStrip.setType(type);    }    @Override    public void buildTaste(Taste taste) {        tasteHotStrip.setTaste(taste);    }    @Override    public TasteHotStrip create() {        return tasteHotStrip;    }}
  1. 开一条生产线生产不同味道的辣条
public class Director {    private Builder builder = null;    public Director(Builder builder) {        this.builder = builder;    }    public void construct(HotStrip type, Taste taste) {        builder.buildType(type);        builder.buildTaste(taste);    }}
  1. 试运行下生产线看看效果
public class BuilderTest {    @Test    public void testTasteHotStrip() {        Builder builder = new TasteHotStripBuilder();        Director director = new Director(builder);        HotStrip hotStrip = new BigHotStrip();//        hotStrip = new KissHotStrip();        Taste taste = new SweetHotStrip();//        taste = new SaltyHotStrip();        director.construct(hotStrip, taste);//可传入任何类型,味道        TasteHotStrip tasteHotStrip = builder.create();        System.out.println(tasteHotStrip.toString());    }}

可以看出,虽然我们生产的辣条种类和口味都不相同,但是它们都有相似的特征,都有种类和口味。 我们提取这些相似的特征,再组装到一起就可以满足我们的需求了。

使用场景

JAVA 中的 StringBuilder。

适合复杂对象各部分经常变化,整体框架稳定。

优点

  1. 建造者独立,易扩展。
  2. 便于控制细节风险。

缺点

  1. 产品必须有共同点,范围有限制。
  2. 如内部变化复杂,会有很多的建造类。

注意事项

与工厂模式的区别是: 建造者模式更加关注与零件装配的顺序。

更多文章:
https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode

0 0
原创粉丝点击