在上篇文章中,对Java Builder模式的使用体验主要是从Builder对构造器改造方面的优秀特性来说的,感觉并没有从Java Builder模式本身的功能和作用去写,因此决定再从Builder模式的作用以及在项目开发中的使用来体验下。
Builder 模式,即建造者模式,顾名思义,这个模式可能更多的使用在产品的组装中使用,具体说就是在软件产品的组件或模块组装的时候使用。
感觉网络上比较好的解释有:
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用的场景:
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。
首先我们来说下,建造者模式中三个重要的角色:
1、Product (生产者):该角色其实类似于工厂里的流水线,它可以生产各种各样的组件,但是并不知道怎样将这些组件进行组装,进而产生出不同的产品。
2、Builder(建造者):该角色类似流水线上的操作工人,它负责将不同的流水线上生产出的不同零件或组件,按照(领导Director)特定要求组装成特定的产品,并给Director提供一个build方法,让其随时可以取走已经组装好的产品。
3、Director(指挥者或者领导):该角色主要根据不同客户的需求,调用不同的Builder对象来组装出特定的产品,提供给客户使用。
为了便于理解,我们假设还有第4个角色:
4、Client(客户): 客户是产品需求的来源,但是客户不会和生产线或工厂的操作工打交道,他们只会开着车,和领导打交道。
好了,各个角色,我们都定义好了,我们寻找一个场景吧。就拿汽车的生产来说事吧。
我们假设有以下场景:
Dirctor是生产CarX品牌汽车公司的领导,ClientA和ClientB是分别来自欧洲和亚洲的客户。ClientA希望买到的CarX汽车能够达到更好的节能和经济性需求,ClientB希望买到的车更好的满足安全性和舒适性。Dirctor根据2个客户的需求,命令工程师设计了2套流水线,2条流水线生产的产品都一样,但是产品的性能不同:
A生产线(ProductionLineA)主要生产小排量的发动机和配置不高的ABS安全系统;
B生产线(ProductionLineB)主要生产排量较大的发动机和配置较高的ABS安全系统;
同时为2条生产线安排了不同的组装工程师BuilderA和BuilderB。
产品的组装命令和验收由Dirctor统一负责。
好了,自此,任务分配完毕,我们开始编码工作了。
首先,对上面问题的分析,我们可以发现,A生产线和B生产线生产的东西名称和功能是一样的,只是性能不同,因此可以对生产线可以进行抽象。
package com.icecode.demo;
public abstract class AbstractProductionLine {
//生产汽车发动机
public abstract void createEngine();
//生产汽车安全系统
public abstract void createSecuritySystem();
//生产汽车车身
public abstract void createCarBody();
}
同样,我们也可以对建造工程师也进行抽象,如下:
package com.icecode.demo;
public abstract class AbstractBuilder {
//命令1:启动生产汽车零部件生产线命令
public abstract void buildCarParts();
//命令2:将命令1生产的零部件组装成完整的汽车
public abstract AbstractProductionLine buildCar();
}
好了,方案和任务都安排好了,我们开始具体实施了。
package com.icecode.demo.impl;
import com.icecode.demo.AbstractProductLine;
/**
* 流水线A
* @author zhanche
*
*/
public class ConcreteProductLineA extends AbstractProductLine {
@Override
public void createEngine() {
System.out.println("------------生产小排量发动机----------");
}
@Override
public void createSecuritySystem() {
System.out.println("----------生产普通标准的安全系统-----------");
}
@Override
public void createCarBody() {
System.out.println("----------生成汽车车身部件-----------");
}
}
package com.icecode.demo.impl;
import com.icecode.demo.AbstractProductLine;
/**
* 流水线B
* @author zhanche
*
*/
public class ConcreteProductLineB extends AbstractProductLine {
@Override
public void createEngine() {
System.out.println("------------生产标准排量的发动机----------");
}
@Override
public void createSecuritySystem() {
System.out.println("----------生产高标准的安全系统-----------");
}
@Override
public void createCarBody() {
System.out.println("----------生成汽车车身部件-----------");
}
}
package com.icecode.demo.impl;
import com.icecode.demo.AbstractBuilder;
import com.icecode.demo.AbstractProductLine;
/**
* 建造工人A
* @author zhanche
*
*/
public class ConcreteBuilderA extends AbstractBuilder {
private AbstractProductLine productLineA = new ConcreteProductLineA();
@Override
public void buildCarParts() {
productLineA.createEngine();
productLineA.createSecuritySystem();
productLineA.createCarBody();
System.out.println("-----生产线A完成一辆汽车零部件的生产-----");
}
@Override
public AbstractProductLine buildCar() {
System.out.println("----------完成一辆汽车A的组装调试----------");
return productLineA;
}
}
package com.icecode.demo.impl;
import com.icecode.demo.AbstractBuilder;
import com.icecode.demo.AbstractProductLine;
/**
* 建造工人B
* @author zhanche
*
*/
public class ConcreteBuilderB extends AbstractBuilder {
private AbstractProductLine productLineB = new ConcreteProductLineB();
@Override
public void buildCarParts() {
productLineB.createEngine();
productLineB.createSecuritySystem();
productLineB.createCarBody();
System.out.println("-----生产线B完成一辆汽车零部件的生产----");
}
@Override
public AbstractProductLine buildCar() {
System.out.println("----------完成一辆汽车B的组装调试----------");
return productLineB;
}
}
到此,我们的产品建造实施实体都安排好了,现在需要做的是实现Director(领导者)角色的功能,他负责下发开始启动生产零部件的命令和开始组装的命令。
package com.icecode.demo.director;
import com.icecode.demo.AbstractBuilder;
import com.icecode.demo.AbstractProductLine;
import com.icecode.demo.impl.ConcreteBuilderA;
import com.icecode.demo.impl.ConcreteBuilderB;
public class Director {
private AbstractBuilder builderA = new ConcreteBuilderA();
private AbstractBuilder builderB = new ConcreteBuilderB();
public AbstractProductLine getProductA() {
builderA.buildCarParts();
//还可以增加对产品质量抽检等功能
return builderA.buildCar();
}
public AbstractProductLine getProductB(){
builderB.buildCarParts();
//还可以增加对产品质量抽检等功能
return builderB.buildCar();
}
}
领导的任务和职责也安排好了,现在2个客户ClientA和ClientB来和Director签订合同,CarX工厂开始完成客户的任务。代码如下:
package com.icecode.demo.client;
import com.icecode.demo.director.Director;
/**
* 客户A
* @author zhanche
*
*/
public class ClientA {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("ClientA 完成与Director生产汽车A的合同");
Director director = new Director();
director.getProductA();
}
}
package com.icecode.demo.client;
import com.icecode.demo.director.Director;
/**
* 客户B
* @author zhanche
*
*/
public class ClientB {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("ClientB 完成与Director生产汽车A的合同");
Director director = new Director();
director.getProductB();
}
}
运行ClientA输出如下结果:
ClientA 完成与Director生产汽车A的合同
------------生产小排量发动机----------
----------生产普通标准的安全系统-----------
----------生成汽车车身部件-----------
----生产线A完成一辆汽车零部件的生产------
----------完成一辆汽车A的组装调试----------
运行ClientB输出如下结果:
ClientB 完成与Director生产汽车A的合同
------------生产标准排量的发动机----------
----------生产高标准的安全系统-----------
----------生成汽车车身部件-----------
-----生产线B完成一辆汽车零部件的生产----
----------完成一辆汽车B的组装调试----------
到此为止,我们的一个建造者模式的应用实例已经完成了。当然,对生产线和建造者的抽象还可以使用接口来实现,原理都是一样的。
有人总结说Builder模式其实综合了模板方法和工厂模式的思想,其实的确可以这么理解,只是建造者模式对工厂化的生产过程和参与者的角色,做了进一步的细化。大家可以根据不同的需求,选择不同的设计模式。
分享到:
相关推荐
1. **AMF(Action Message Format)通信**:AMF是一种二进制数据格式,用于在Flex客户端和Java服务器之间高效传输数据。Flex SDK包含一个名为BlazeDS的组件,它支持AMF协议,使Java和Flex之间的数据交换变得快速且...
此外,还有“建造者模式”(Builder Pattern)、“模板方法模式”(Template Method Pattern)、“命令模式”(Command Pattern)、“责任链模式”(Chain of Responsibility Pattern)、“享元模式”(Flyweight ...
PowerBuilder 8.3 是一款历史悠久的开发工具,主要用于构建企业级的应用程序,尤其是在...通过安装光盘压缩文件"PowerBuilder8.3.rar",开发者可以重新体验这款经典工具的魅力,并继续构建稳定、可靠的企业级系统。
4. **建造者模式(Builder)**:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 5. **原型模式(Prototype)**:通过复制已有对象来创建新对象,避免重复初始化过程。 6. **适配器...
5. 集成开发环境:Scene Builder可与Eclipse、IntelliJ IDEA等主流Java IDE无缝集成,进一步提高开发效率。 四、使用场景与最佳实践 1. 教育培训:对于初学者来说,Scene Builder是理解JavaFX UI设计的绝佳工具,...
Builder模式是一种创建型设计模式,常用于对象实例化过程的复杂性管理,使得创建过程更加清晰,易于维护。这款插件通过自动化生成这一模式,大大减少了手动编码的工作量,提高了代码质量。 二、主要功能 1. 自动化...
在本教程中,我们将深入探讨如何使用Flash Builder...这个过程中,不仅涉及到Flex客户端的AMF通信,还包括Java后端的JPA实体映射、DAO设计模式以及服务暴露和配置。学习和掌握这些技术将极大地提升开发效率和应用质量。
在Android开发过程中,为了提高...总的来说,这款插件是Android开发者提升工作效率的利器,它将Builder模式与自动化结合,减少了手动编写重复代码的时间,使开发者能够更加专注于业务逻辑的实现,提升整体的开发体验。
PowerBuilder可以与其他系统进行接口集成,如通过COM/ActiveX组件与.NET或Java应用交互,或者使用Web服务接口与外部系统通信。 10. 实例分析与实战项目: 结合实例学习是最好的教学方式。通过完成实际项目,如...
### PowerBuilder:数据库应用开发的全能工具 ...综上所述,PowerBuilder 9.0凭借其对现代技术和开发模式的深度集成,以及其核心优势,成为了数据库应用开发领域的佼佼者,为开发者提供了强大、灵活且高效的开发体验。
Java Flex入门实例主要涉及到的是Java和Adobe Flex的集成开发,这是一种常见的富互联网应用程序(Rich Internet Application,RIA)开发模式。Flex是基于ActionScript和Flash Player技术的开发框架,用于构建具有...
5. **数据库连接**:PowerBuilder支持多种数据库,包括Oracle、SQL Server、MySQL等,通过ODBC(Open Database Connectivity)或JDBC(Java Database Connectivity)接口,方便地建立和管理数据库连接。 6. **网络...
设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...
WindowBuilder for Eclipse 4.4 是一款强大的图形化开发工具,专为Eclipse IDE的4.4版本设计,极大地简化了Java GUI(图形用户界面)应用程序的开发过程。这款插件允许开发者通过拖放的方式创建和编辑用户界面,显著...
4. **Android API集成**:C++ Builder通过JNI(Java Native Interface)与Android API交互,允许开发者调用Android系统的原生功能,如传感器、GPS、多媒体等。 5. **事件驱动编程**:在Android开发中,事件驱动编程...
- **挑战**:Flex Builder 面临的最大挑战来自于盈利模式。它采取了类似于Borland 公司推出的JBuilder 的收费模式,这在面对免费的开源IDE Eclipse 时显得竞争力不足。历史上,JBuilder 就是因为Eclipse 的崛起而...
- **AMF (Action Message Format)**: Flex与Java交互的主要协议是AMF,它是一种二进制格式,能够高效地传输数据,减少了网络延迟。 - ** BlazeDS**: Adobe的BlazeDS是一个开源服务器端项目,它提供了AMF通道,使得...
Java 课程教学可以采取一些新的教学模式,例如体验式教学、案例教学、项目驱动等。这些新的教学模式可以提高学生的实践能力和应用能力。例如,在教学过程中,教师可以使用项目驱动的教学模式,让学生参与实际的项目...