建造者模式(Builder)

转载 2016年08月30日 08:30:03

建造者模式(Builder)

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,由于需求的变化,这个复杂对象的某些部分经常面临着剧烈的变化,一些基本部件不会变。所以需要将变与不变分离。与抽象工厂的区别:在建造者模式里,有个指导者(Director),由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造者模式可以强制实行一种分步骤进行的建造过程。

建造者类图:

这里写图片描述

建造者模式四要素:

  • 1.产品类Product:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。

  • 2.抽象建造者类Builder: 将建造的具体过程交与它的子类来实现,这样更容易扩展。

  • 3.建造者类ConcreteBuilder: 组建产品;返回组建好的产品。

  • 4.指导类Director: 负责调用适当的建造者来组建产品,指导类一般不与产品类发生依赖关系,与指导类直接交互的是建造者类。

似乎很抽象。举个例子:前面你创建了一个生产保时捷的工厂,生产一台保时捷911需要的主要部件都一样(引擎,轮子,方向盘…)和流程是不变的,变的是引擎,轮子,控制系统等等部件具体实现,这些部件的生产交由具体的builder去生产。

//抽象生产者
public interface Builder {

    void buildPartA();
    void buildPartB();
    void buildPartC();

    Product buildProduct();
}
//具体生产者
public class ConcreteBuilder implements Builder {

    Product product;

    @Override
    public void buildPartA() {

    }

    @Override
    public void buildPartB() {

    }

    @Override
    public void buildPartC() {

    }

    @Override
    public Product buildProduct() {
        return product;
    }
}
//产品由各个组件组成
public class Product {

    //partA
    //partB
    //partC
}
//指导者,产品生产流程规范
public class Director {

    Builder builder;
    //由具体的生产者来生产产品
    public Director(Builder builder) {
        this.builder = builder;
    }
    //生产流程
    public void buildProduct(){
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}
public static void main(String[] args) {
        //只需要关心具体建造者,无需关心产品内部构建流程。
        //如果需要其他的复杂产品对象,只需要选择其他的建造者.
        Builder builder = new ConcreteBuilder();
        //把建造者注入指导者
        Director director = new Director(builder);
        //指导者负责流程把控
        director.buildProduct();
        // 建造者返回一个组合好的复杂产品对象
        Product product = builder.buildProduct();
    }

总结

建造者模式优点:

  • 1.建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在指导者类中对整体而言可以取得比较好的稳定性。

  • 2.建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成。

适用场景:需要生成的对象具有复杂的内部结构;需要生成的对象内部属性本身相互依赖。

Test

package com.qbz.test;

class Car {
    // frame
    String frame;
    // engine
    String engine;
    // wheel
    String wheel;
    // ...
}

interface Builder {
    void buildFrame();

    void buildEngine();

    void buildWheel();

    Car buildCar();
}

// 911制造者
class Builder911 implements Builder {
    Car car = new Car();

    @Override
    public void buildFrame() {
        System.out.println("制造911骨架");
    }

    @Override
    public void buildEngine() {
        System.out.println("制造911引擎");
    }

    @Override
    public void buildWheel() {
        System.out.println("制造911车轮");
    }

    @Override
    public Car buildCar() {
        System.out.println("911汽车各部组装完毕");
        return car;
    }
}

// Cayma制造者
class BuilderCayma implements Builder {
    Car car = new Car();

    @Override
    public void buildFrame() {
        System.out.println("制造Cayma骨架");
    }

    @Override
    public void buildEngine() {
        System.out.println("制造Cayma引擎");
    }

    @Override
    public void buildWheel() {
        System.out.println("制造Cayma轮子");
    }

    @Override
    public Car buildCar() {
        System.out.println("Cayma汽车各部组装完毕");
        return car;
    }
}

// 指导者
class Director {
    private Builder builder;

    // 传入具体制造者
    public Director(Builder builder) {
        this.builder = builder;
    }

    public Car build() {
        // 制造汽车各个组件
        builder.buildEngine();
        builder.buildFrame();
        builder.buildWheel();

        return builder.buildCar();
    }
}

public class Main {

    public static void main(String[] args) {
        // 制造一台911
        Builder builder = new Builder911();
        Director director = new Director(builder);
        Car car911 = director.build();
        // 制造Cayma
        Builder builder2 = new BuilderCayma();
        Director director2 = new Director(builder2);
        Car carCayma = director2.build();
    }

}

输出:

制造911引擎
制造911骨架
制造911车轮
911汽车各部组装完毕
制造Cayma引擎
制造Cayma骨架
制造Cayma轮子
Cayma汽车各部组装完毕

设计模式之Builder模式 (C++实现)

刚开始我一直感觉建造者模式不太好懂,也许是我笨了点缘故,勤能补拙嘛,所以只能多看多想了 大话设计模式里面那个对于建造者模式我讲解,个人感觉不太好理解,我是看了很多遍也没体会到那样设计的精髓,后来在另...
  • i_like_cpp
  • i_like_cpp
  • 2013年05月30日 10:26
  • 2844

使用 Builder 模式构造 JavaBean 的好处

我们一般在构造一个javaBean 对象时,无非有三种写法: 1.直接通过构造函数传参的方式设置属性,这种方法如果属性过多的话会让构造函数十分臃肿,而且不能灵活的选择只设置某些参数。 2.采用重...
  • qq_18796911
  • qq_18796911
  • 2016年12月20日 22:08
  • 3435

Android开发中无处不在的设计模式——Builder模式

上一篇文章介绍了单例模式,这一篇继续介绍一个常见的模式——Builder模式。那么什么是Builder模式呢。你通过搜索,会发现大部分晚上的定义都是 将一个复杂对象的构建与它的表示分离,使得同样的...
  • sbsujjbcy
  • sbsujjbcy
  • 2015年10月18日 10:16
  • 5011

浅谈JAVA设计模式之——建造者模式(Builder)

一、概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2.当构造过程必须允许被...
  • l1028386804
  • l1028386804
  • 2015年05月02日 21:22
  • 9538

Android设计模式之建造者模式(builder pattern)

builder设计模式我们很常见,比如我们使用AlertDialog的时候就使用的builder设计模式,著名的Universal-Image-Loader的初始化配置也是使用的builder设计模式...
  • nugongahou110
  • nugongahou110
  • 2015年12月25日 10:08
  • 2893

Java设计模式——Builder模式

builder模式的使用目的是为了将构建复杂对象的过程和它的部件解耦。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。...
  • u013761665
  • u013761665
  • 2015年12月11日 13:47
  • 2586

Android设计模式——Builder模式

什么是Builder模式呢。你通过搜索,会发现大部分网上的定义都是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 但是看完这个定义,并没有什么卵用,你依然...
  • jie1991liu
  • jie1991liu
  • 2015年11月04日 17:19
  • 7550

Java高效编程之Builder模式

前言在《Effective Java 第2版》中有提到,遇到多个构造器参数时要考虑使用构建器(Builder模式)。相比于重叠构造器(telescoping constructor)模式和JavaBe...
  • lms1719
  • lms1719
  • 2017年04月26日 11:19
  • 242

【java设计模式】之 建造者(Builder)模式

我们还是举上一节的例子:生产汽车。上一节我们通过模板方法模式控制汽车跑起来的动作,那么需求是无止境的,现在如果老板又增加了额外的需求:汽车启动、停止、鸣笛引擎声都由客户自己控制,他想要什么顺序就什么顺...
  • eson_15
  • eson_15
  • 2016年05月06日 08:59
  • 4926

Java设计模式--Builder模式

Java设计模式–Builder模式标签(空格分隔): 设计模式本文是遇到实际问题想办法解决,并没有详细解释理论,博主水平有限.1.问题提出问题的提出来源于实际代码中遇到的问题,下面讲述问题.公司做一...
  • u012706811
  • u012706811
  • 2016年08月13日 18:08
  • 1555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建造者模式(Builder)
举报原因:
原因补充:

(最多只允许输入30个字)