`
指尖残血
  • 浏览: 3054 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

本文参考:《修炼Java开发技术:在架构中体验设计模式和算法之美   于广编著》。

 

  在软件开发过程中,当遇到一个“复杂的对象”,该对象由好多部分组成,各个部分的组合比较稳定或者有一定的依赖次序,但各个部分自身却会经常面临着变化时,冷䲽隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构件算法”,这就是建造者模式的任务。

  建造者模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要使传入建造者和建造工具,关于内部是如何建造成成品的,调用者无需关心。

 

适用场景:

1、需要生成的产品有复杂的内部结构。

2、需要生成的产品对象的属性互相依赖。

3、在对象的创建过程中会使用到其他的对象。

 

建造者模式的结构:

Director<>--(聚合)--> Builder <|--(泛化)-- ConcreteBuilder<--(依赖)--Product

 

Builer(抽象建造者):它为创建一个产品product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类buildPartX(),它们用于创建复杂对象的各个部件;另一类方法时getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

Product(产品角色):它是被构建的复杂对象,包含多个组成部件,集体建造者创建该产品的内部表示并定义它的装配过程。

Director(指挥者):指挥者又被称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其构件方法construct()中调用建造者对象的部件构造与装配方法,完成建造复杂对象的任务。客户端一般与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象,然后通过指挥者类的构造函数或者setter方法将该对象传入指挥者类中。

 

举例说明:

加入要通过一个汽车工厂组装一辆汽车。其中汽车由车头、车身和车位3部分组成,它的基本组装步骤如下:1、组装车头;2、组装车身;3、组装车尾。

不管要创建吉普车、卡车、公交车,它们都可以各自重新定义车头、车身和车尾的组装方法。而通过这些被重新定义的方法和相同的组装步骤,就可以组装具有不同属性的各类汽车。

由此可以知道,上述场景满足Builder模式的应用场景所提到的如下条件:

1、对象的创建:我的需要创建对象;

2、创建的是一个复合对象:汽车的头部,车身,尾部等复合对象;

3、关注对象创建的各部分的创建过程:吉普车和卡车等对车头、车身、车尾的组装方法不尽相同。

设计类如下:

CarDirector:汽车组装操作的封装类;

CarBuilder:汽车组装抽象类;

JeepBuilder:吉普车组装类,继承CarBuilder类;

Car:汽车类,包括车头、车身、车尾等属性。由JeepBuilder等创建。

package org.dyb.design.builder;

public class Car {
    private String head;//车头
    private String body;//车身
    private String tail;//车尾
    public String getHead() {
        return head;
    }
    public void setHead(String head) {
        this.head = head;
    }
    public String getBody() {
        return body;
    }
    public void setBody(String body) {
        this.body = body;
    }
    public String getTail() {
        return tail;
    }
    public void setTail(String tail) {
        this.tail = tail;
    }
    @Override
    public String toString(){
        return head+"-"+body+"-"+tail;
    }
}

 

package org.dyb.design.builder;

public abstract class CarBuilder {
    public abstract void makeHead();
    public abstract void makeBody();
    public abstract void makeTail();
    public abstract Car getCar();//得到汽车对象
}

 

package org.dyb.design.builder;

public class JeepBuilder extends CarBuilder {
    private Car car = new Car();
    @Override
    public void makeHead() {
        car.setHead("jeep head");
    }

    @Override
    public void makeBody() {
        car.setBody("jeep body");
    }

    @Override
    public void makeTail() {
        car.setTail("jeep tail");
    }

    @Override
    public Car getCar() {
        return car;
    }

}

 

package org.dyb.design.builder;

public class CarDirector {
 
    public void makeCar(CarBuilder builder){
        builder.makeHead();//组装车头
        builder.makeBody();//组装车身
        builder.makeTail();//组装车尾
    }
}

 测试:

package org.dyb.design.builder;

import org.junit.Test;

public class TestBuilder {

    @Test
    public void test(){
        CarDirector carDirector = new CarDirector();
        CarBuilder b = new JeepBuilder();
        carDirector.makeCar(b);
        Car car = b.getCar();
        System.out.println(car.toString());
    }
}

 结果:jeep head-jeep body-jeep tail

 

建造者模式与工厂模式的区别:

关注点不同。工厂模式只关心你要的是什么,而不关心东西的具体细节是什么。建造者模式则关心的是这个东西的具体细节的创建。

 

建造者模式的总结:

优点:

1、封装性。

  可以使客户端不必知道产品内部组成的细节。

2、建造者独立,容易扩展。

3、便于控制细节风险。

  因为具体的建造者是独立的,因此可以对建造者建造过程逐步细化,而不对其他的模块产生任何影响。

 

使用场景:

1、相同的方法,不同的执行顺序,产生不同的事件结果。

2、多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又不相同。

分享到:
评论
1 楼 听风者森林 2017-02-16  
不错。言简意赅

相关推荐

    java实现建造者模式(Builder Pattern)

    java实现建造者模式(Builder Pattern) java实现建造者模式(Builder Pattern)是一种软件设计模式,旨在解决软件系统中创建复杂对象的问题。建造者模式可以将复杂对象的创建过程分解为多个简单的对象一步一步构建...

    建造者模式1

    建造者模式 建造者模式(Builder Pattern)是一种创造型设计模式,用于将一个复杂对象的构造与其表示分离,使同样的构建过程可以创建不同的表示。该模式通过将一个复杂对象分解为多个简单的对象,逐步完成复杂对象...

    建造者模式c++实现

    建造者模式是一种设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在C++中实现建造者模式,我们可以遵循以下步骤: 首先,我们需要定义一个抽象建造者(Builder)类,它声明了一...

    Java建造者模式示例

    建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使得相同的构建过程可以创建不同的表示。在Java中,StringBuilder类是建造者模式的一个典型应用。 StringBuilder类用于创建和操作动态字符串。...

    深入分析JAVA 建造者模式

    深入分析JAVA 建造者模式 JAVA 建造者模式是一种创建型模式,提供了一种创建对象的最佳方式。该模式使用多个简单的对象一步一步构建成一个复杂的对象。 Builder 类会一步一步构造最终的对象,而该 Builder 类是...

    Python实现的建造者模式示例

    在软件设计领域,建造者模式(Builder Pattern)是一种创建型设计模式,用来创建复杂的对象。该模式涉及到将一个复杂对象的构建与它的表示分离,同样的构建过程可以创建不同的表示。建造者模式通常用于那些产品对象...

    java实现建造者模式

    建造者模式将一个对象的构建过程和其表示分离,允许通过相同的构建过程创建不同的表示。在建造者模式中,指导者负责组装建造者提供的各个部分,而具体的建造者则负责实际构建和装配

    4. 建造者模式1

    建造者模式是一种设计模式,它的主要目标是解决创建复杂对象时面临的参数过多、构造过程复杂以及需要进行参数校验等问题。在Java等不支持默认参数和具名参数的编程语言中,这种模式显得尤为重要。 首先,建造者模式...

    .NET建造者模式讲解

    建造者模式是一种设计模式,它的主要目的是将构造过程与对象的表示分离,使得同样的构建过程可以创建不同的表示。在.NET框架中,这种模式可以应用于多种场景,如ASP.NET开发,帮助开发者更灵活地构建复杂的对象。 ...

    设计模式之建造者模式代码示例

    建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的构建过程分解为一系列步骤,使得构建过程可以独立于其表示进行。这种模式允许客户端使用相同的构建过程创建不同表现形式的...

    建造者模式(Builder Pattern)原理图

    建造者模式是一种创建型设计模式,用于简化复杂对象的创建过程。以下是建造者模式的关键概念和步骤: 1. **分离复杂对象的构建和表示**:建造者模式将一个复杂对象的构建过程与其最终的表示形式分离开来。这样做的...

    java 建造者模式代码

    建造者模式是一种设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在Java中,这种模式通常用于构建对象时,尤其是当对象的构造过程复杂,需要多步骤或者允许用户自定义构建过程时...

    设计模式之建造者模式

    建造者模式(Builder Pattern)是设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,通过将构造过程与对象本身分离,使得同样的构造过程可以创建不同的表示。这种模式常用于当创建对象的步骤复杂或者...

    建造者模式.pptx

    ### 建造者模式详解 #### 模式介绍 建造者模式(Builder Pattern)是设计模式中的一种,主要用于创建复杂对象。此模式的核心在于将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。简单...

    Java设计模式之建造者模式实例详解

    "Java设计模式之建造者模式实例详解" 本文主要介绍了Java设计模式之建造者模式,结合具体实例形式分析了建造者模式的概念、原理、实现方法与相关使用注意事项。 建造者模式的概念 建造者模式(Builder Pattern)...

    JavaScript设计模式之建造者模式实例教程

    建造者模式是一种软件设计模式,它允许我们分步骤地创建复杂的对象,同时将对象的构建过程和其表示相分离。这种模式在JavaScript中同样适用,能够帮助我们更好地组织代码,提高代码的可读性和可维护性。以下是关于...

    python设计模式-建造者模式.rar

    建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤地创建一个复杂对象。这个模式通过将构建过程和表示过程分离,使得同样的构建过程可以创建不同的表示。 压缩包文档是一个简单的Python示例,展示...

Global site tag (gtag.js) - Google Analytics