【设计模式】05-建造者模式

建造者模式

源码:https://github.com/sdlszjb/DesignPattern

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

/**
 * created by lsk on 2018-02-24 22:07.
 * 
 * 产品类
 * 
 * @author 庄壮壮
 */
public class BuilderProduct {
    public void doSomething() {
        System.out.println("product doSomething.");
    }
}

/**
 * created by lsk on 2018-02-24 22:08.
 *
 * 抽象建造者
 * 
 * @author 庄壮壮
 */
public abstract class BuilderBuilder {
    // 设置产品的不同部分,以获得不同的产品
    public abstract void setPart();

    // 建造产品
    public abstract BuilderProduct builderProduct();
}

/**
 * created by lsk on 2018-02-24 22:09.
 *
 * 具体的建造者。
 * 如果由多个产品类,就有几个具体的建造者。并且这多个产品类具有相同的接口或抽象类。
 *
 * @author 庄壮壮
 */
public class BuilderConcreteBuilder extends BuilderBuilder {

    private BuilderProduct product = new BuilderProduct();

    @Override
    public void setPart() {
        // TODO 产品类内的逻辑处理
    }

    @Override
    public BuilderProduct builderProduct() {
        return product;
    }
}

/**
 * created by lsk on 2018-02-24 22:12.
 *
 * 导演类
 * 在建造者模式比较庞大时,导演类可以有多个。
 *
 * @author 庄壮壮
 */
public class BuilderDirector {
    private BuilderBuilder builder = new BuilderConcreteBuilder();

    // 构建不同的产品
    public BuilderProduct getAProduct() {
        builder.setPart();
        /**
         * 设置不同的零件,产生不同的产品
         */
        return builder.builderProduct();
    }
}

/**
 * created by lsk on 2018-02-24 22:33.
 *
 * @author 庄壮壮
 */
public class BuilderTests {

    @Test
    public void testClient() {
        BuilderDirector director = new BuilderDirector();
        BuilderProduct product = director.getAProduct();
        product.doSomething();
    }
}

优点

  • 封装性。
  • 建造者独立,容易扩展
  • 便于控制细节风险

使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果,采用建造者模式。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,采用该模式。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候采用建造者模式非常合适。

注意事项

  • 建造者模式关注的是零件类型和装配工艺(顺序)。
  • 工厂方法模式关注的时零件的产生以及产品的产生,并不关心装配的顺序。

扩展

  • 模板方法模式。

最佳实践

  • 若使用建造者模式,一定要考虑使用模板方法模式。
posted @ 2018-03-14 21:28  新崔斯特姆的营地  阅读(99)  评论(0编辑  收藏  举报