- 浏览: 103205 次
- 性别:
- 来自: 深圳
文章分类
最新评论
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
本文介绍设计模式中的建造者(Builder)模式的概念,用法,以及实际应用中怎么样使用Builder模式进行开发。
Builder模式的概念
Builder模式是一种对象创建型模式,它跟工厂模式(包括工厂方法模式与虚拟工厂模式)一样,都用来创建类的对象。我们先阐述一下Builder模式的定义:Builder模式用来创建复合对象,并把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象;另一方面,为了统一创建过程,又把对象创建的操作统一封装在名为Director所提供的方法里。
复合对象的概念:
所谓复合对象,指有别于一般的对象,该对象具有不同的复合属性。比如我们把一辆汽车看成一个复合对象,是因为该汽车由多个复杂的零部件组成,这些零部件可能因为生产厂家的不同等等而不同,但这些不同的零部件最终都能被组装为一辆汽车。这些不同的零部件我们可称之为汽车的复合属性,同样可称该汽车为一个复合对象。
我们再用类图来说明Builder模式的结构,如图:
[该图出自维基百科wikipedia.org]
图示,
- Builder#buildPart方法(不同部分的创建都是一个buildPart方法)用来创建产品Product的各部分;
- ConcreteBuilder为继承自Builder的具体的创建类;
- Builder#getResult或ConcreteBuilder#getResult返回最终被创建的复合对象;
- Product为被创建的产品对象;
- Director#construct方法是对整个产品创建过程的封装;该方法内部将调用Builder#buildPart方法;一个典型的construct方法实现可能为:
public void construct(Builder builder) {
builder.buildPart1();
builder.buildPart2();
...
}
有时为了简便,又可把Director与ConcreteBuilder合并为一个类。
Builder模式与工厂模式的区别与Builder模式的应用场景
我们上面提到了,Builder模式和工厂模式一样,都属于对象创建型模式,都用来创建类的对象。但它们存在在本质的区别:- 在工厂模式里,我们无需关心产品的各部分是如何被创建的;但在Builder模式里,会把产品的创建过程抽象为多个部分。也就是说,工厂模式被关注的是整个产品,而Builder模式被关注的是产品的组成部分的创建过程。
- 因为上述关注点的不一样,工厂模式被创建的产品是一个单一产品;Builder模式创建的是一个复合产品。
简单一点说,在具体的应用中,我们是选用工厂模式来创建对象呢还是选用Builder模式来创建对象,完全取决于我们的关注点。
比如同为创建一辆汽车,如果我们只需关注只是从工厂里造出的这一辆汽车本身(然后加以使用),我们就可以使用工厂模式来创建该汽车;但如果我们还应该关注该汽车的各部分是怎么造出来的(或者说,不同的工厂对产品的各部分的造法不一样),我们就应该使用Builder模式。
Builder模式的应用场景
- 对象的创建:Builder模式是为对象的创建而设计的模式
- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
Builder模式的应用范例
下面我们举个例子来加深我们对Builder模式的理解。比如我们要通过一个汽车加工厂,组装一辆汽车;汽车由车头,车身,车尾3部分组成;它的基本组装步骤是:
- 组装车头
- 组装车身
- 组装车尾
不管被组装的是吉普车,卡车,还是公交车,它们都可以各自重新定义车头,车身与车尾的组装方法;而通过这些被重新定义的组装方法,通过相同的组装步骤就可以组装具有不同属性的各类汽车了。
通过上面的分析,我们知道,该范例满足Builder模式的应用场景所提到的条件:
- 对象的创建:我们需要创建汽车对象
- 创建的是一个复合对象:我们需要创建的汽车对象是具有车头,车身,车尾等复合属性的复合对象
- 关注对象创建的各部分的创建过程:吉普车,卡车等对车头,车身,车尾的组装方法不尽相同
下面我们用Builder设计模式来抽象以上组装过程:
- CarDirector:汽车组装操作的封装类
- CarBuilder:汽车组装抽象类
- JeepBuilder:吉普车组装类,继承自CarBuilder类。
- Car:汽车类,包括车头,车身,车尾等属性。相当于产品类。由CarBuilder/JeepBuilder等创建。
源代码
//汽车类
public class Car {
//车头
private String head;
//车身
private String body;
//车尾
private String tail;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
}
//汽车组装抽象类
public abstract class CarBuilder {
//组装车头
public abstract void makeHead();
//组装车身
public abstract void makeBody();
//组装车尾
public abstract void makeTail();
//得到被组装好的汽车对象
public abstract Car getCar();
}
//吉普车组装类
public class JeepBuilder extends CarBuilder {
Car car = new Car();
//组装车头
public void makeHead() {
car.setHead("Jeep head");
}
//组装车身
public void makeBody() {
car.setBody("Jeep body");
}
//组装车尾
public void makeTail() {
car.setTail("Jeep tail");
}
public Car getCar() {
return car;
}
}
//汽车组装操作的封装类:该类封装了对整个汽车的组装操作
public class CarDirector {
//汽车的组装操作
public void makeCar(CarBuilder builder) {
//组装车头
builder.makeHead();
//组装车身
builder.makeBody();
//组装车尾
builder.makeTail();
}
}
//调用
public class Client {
public static void main(String[] args) {
CarDirector director = new CarDirector();
//创建吉普车生成器(工厂)
CarBuilder b = new JeepBuilder();
//调用CarDirector组装整个汽车
director.makeCar(b);
//得到组装好的汽车
Car car = b.getCar();
System.out.println(car.getHead());
System.out.println(car.getBody());
System.out.println(car.getTail());
}
}
public class Car {
//车头
private String head;
//车身
private String body;
//车尾
private String tail;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
}
//汽车组装抽象类
public abstract class CarBuilder {
//组装车头
public abstract void makeHead();
//组装车身
public abstract void makeBody();
//组装车尾
public abstract void makeTail();
//得到被组装好的汽车对象
public abstract Car getCar();
}
//吉普车组装类
public class JeepBuilder extends CarBuilder {
Car car = new Car();
//组装车头
public void makeHead() {
car.setHead("Jeep head");
}
//组装车身
public void makeBody() {
car.setBody("Jeep body");
}
//组装车尾
public void makeTail() {
car.setTail("Jeep tail");
}
public Car getCar() {
return car;
}
}
//汽车组装操作的封装类:该类封装了对整个汽车的组装操作
public class CarDirector {
//汽车的组装操作
public void makeCar(CarBuilder builder) {
//组装车头
builder.makeHead();
//组装车身
builder.makeBody();
//组装车尾
builder.makeTail();
}
}
//调用
public class Client {
public static void main(String[] args) {
CarDirector director = new CarDirector();
//创建吉普车生成器(工厂)
CarBuilder b = new JeepBuilder();
//调用CarDirector组装整个汽车
director.makeCar(b);
//得到组装好的汽车
Car car = b.getCar();
System.out.println(car.getHead());
System.out.println(car.getBody());
System.out.println(car.getTail());
}
}
运行并显示Client:
C:\builder>javac *.java
C:\builder>java Client
Jeep head
Jeep body
Jeep tail
C:\builder>
C:\builder>java Client
Jeep head
Jeep body
Jeep tail
C:\builder>
上面演示了吉普车(Jeep)的生产过程,如果需要创建公交车(Bus),我们可以依葫芦画瓢,使用一个继承自CarBuilder的BusBuilder,便可简单地生产一个具有与吉普车不同的车头,车身,车尾的汽车来。
Builder模式小结
Builder模式是一种注重对象创建细节的设计模式,它被用来动态创建复合对象。发表评论
-
设计模式之 State - 状态模式
2010-12-18 16:49 1121State模式也叫状态模式,是由GoF提出的23种软件设计模式 ... -
设计模式之 Strategy - 策略模式
2010-12-18 16:46 1389Strategy模式也叫策略模 ... -
设计模式之 Visitor - 访问者模式
2010-12-18 16:45 1483Visitor模式也叫访问者 ... -
设计模式之 Template Method - 模板方法模式
2010-12-18 16:41 1601Template Method模式也叫模板方法模式,是由G ... -
设计模式之 Observer - 观察者模式
2010-12-18 16:33 1435Observer模式也叫观察者 ... -
设计模式之 Memento - 备忘录模式
2010-12-18 16:31 1091Memento模式也叫备忘录 ... -
设计模式之 Mediator - 中介者模式
2010-12-18 16:29 1148Mediator模式也叫中介者模式,是由GoF提出的23种软件 ... -
设计模式之 Iterator - 迭代模式
2010-12-18 16:27 1200Iterator模式也叫迭代模式,是由GoF提出的23种设 ... -
设计模式之 Interpreter - 解释器模式
2010-12-18 16:23 1031Interpreter模式也叫解释器模式,是由GoF提出的 ... -
设计模式之 Command - 命令模式
2010-12-18 16:20 925Command(CoR)模式也叫命 ... -
设计模式之 Chain of Responsibility - 职责链模式
2010-12-18 16:18 1234Chain of Responsibility(CoR)模 ... -
设计模式之 Proxy - 代理模式
2010-12-16 23:45 1088Proxy模式也叫代理模式,是由GoF提出的23种软件设计 ... -
设计模式之 Flyweight - 享元模式
2010-12-16 23:42 1083Flyweight模式也叫享元模式,是由GoF提出的23种 ... -
设计模式之 Facade - 外观模式
2010-12-16 23:41 1043Facade模式也叫外观模式 ... -
设计模式之 Singleton - 单态模式
2010-11-26 11:58 886Singleton模式也叫单态模式,是由GoF提出的2 ... -
设计模式之 Decorator - 装饰模式
2010-11-25 23:48 837装饰模式,The Decorator Pattern atta ... -
设计模式之 Composite - 组合模式
2010-11-25 23:35 1493Composite模式也叫组合 ... -
设计模式之 Bridge - 桥接模式
2010-11-25 23:08 1043Bridge模式也叫桥接模式,是由GoF提出的23种软件设计模 ... -
设计模式之 Adapter - 适配器模式
2010-11-25 22:58 950Adapter模式也叫适配器模式,是由GoF提出的23种设 ... -
设计模式之Prototype - 原型模式
2010-11-25 22:14 1165Prototype模式也叫原型模式,是由GoF提出的23种设计 ...
相关推荐
建造者模式是一种软件设计模式,属于创建型模式之一,主要用于解决创建复杂对象的问题。在实际应用中,当对象的构造过程过于复杂,涉及到多个属性或者子对象的组合时,直接通过构造函数创建可能会导致代码混乱、难以...
**建造者模式(Builder Pattern)**是软件设计模式中的一种,属于创建型模式。它将复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常用于那些需要大量构造参数的对象,通过...
设计模式之---建造模式 1,建造模式属于对象的创建模式,是将一个产品的内部表象和产品的生产分割出来 2.使用原因:为了将构建复杂对象的过程和它的不见解耦; 3 使用情况:建造模式利用一个导演着对象和一个具体...
Java设计模式-建造者模式详解 Java设计模式-建造者模式详解将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式(Builder)是使用多个“小型”工厂来最终创建出一个完整对象。...
建造者模式(Builder)是设计模式中的一种结构型模式,它允许我们分步骤构建复杂的对象,而无需暴露构造过程。这种模式将构造过程与对象的表示分离,使得同样的构造过程可以创建不同的表示。在C++中,建造者模式通常...
建造者模式(Builder)是Java设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露其构造过程。在Android开发中,这种模式尤其有用,因为Android组件如Activity、Fragment等的初始化过程通常...
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种方法来分步骤构建复杂的对象,使得构建过程和表示分离,使得同样的构建过程可以创建不同的表示。这种模式经常在对象的构造过程中需要进行多种选择...
**建造者模式(Builder Pattern)**是软件设计模式中的一种创建型模式,它允许我们分步骤构建复杂的对象,而无需暴露构建过程。在C++中,这种模式常用于将对象的创建过程与使用过程分离,使得对象的构建更加灵活,...
在Java中,建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤地构建一个复杂对象。这个模式通过将构建过程和表示过程分离,使得同样的构建过程可以创建不同的表示。建造者模式特别适合用于创建...
"设计模式-建造者模式" 设计模式是软件开发中常用的解决问题的方法和模式,旨在提高软件的可维护性、灵活性和可重用性。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。今天,我们将讨论创建型模式...
建造者模式(Builder Pattern)是一种创建型设计模式,允许使用多个简单的对象一步一步构建一个复杂的对象。它将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式的组成 产品...
建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的构建过程分解为一系列步骤,使得构建过程可以独立于其表示进行。这种模式允许客户端使用相同的构建过程创建不同表现形式的...
在深入探讨C#设计模式中的建造者(Builder)模式之前,我们先来理解一下什么是设计模式。设计模式是在软件工程中解决常见问题的一种通用可重用解决方案,它们提供了一种标准化的方法来解决软件开发中遇到的挑战。...
建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...
建造者模式(Builder Pattern)是软件工程中一种用于创建对象的抽象工厂方法,它将复杂的对象构造过程分离开来,使得相同的构造过程可以创建不同的表示。这种模式在C#编程中广泛应用于创建对象的复杂性较高,或者...
在《设计模式专题之(四)建造者模式》中,我们将探讨如何通过Python和C++实现建造者模式。首先,我们要理解建造者模式的基本组件: 1. **产品(Product)**:这是要构建的复杂对象。在Python和C++中,这通常会定义...
建造者模式,是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在对象的构建过程比较复杂,需要多个步骤时。在建造者模式中,我们创建一个指导对象(Director),该对象负责组织构建过程,而具体的构建...
- 建造者模式(Builder):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - 对象池模式(Pool):通过重用已创建的对象来减少对象的创建和销毁次数。 2. **结构型模式**:这类模式...
明确建造者(Builder)、具体建造者(Concrete Builder)、指导者(Director)、产品(Product)之间的职责和联系。 ◆建造者(Builder): 给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,...
在Java中,Builder模式通常包含四个主要角色:Product(产品),Builder(建造者),ConcreteBuilder(具体建造者)和Director(导演)。Product是被构建的对象,Builder定义了产品的构造接口,ConcreteBuilder实现...