现在的位置: 首页 > 综合 > 正文

java模式之建造者模式

2013年06月09日 ⁄ 综合 ⁄ 共 10159字 ⁄ 字号 评论关闭

定义

  将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

实用范围

  1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

  2 当构造过程必须允许被构造的对象有不同表示时。

特点:

Builder模式的结构:

 

建造者(Builder)角色

给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。

模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

具体建造者(Concrete Builder)角色

担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:

  • 实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
  • 在建造过程完成后,提供产品的实例。

指导者(Director)角色

担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

产品(Product)角色

产品便是建造中的复杂对象。

指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。

以下情况应当使用建造者模式:

1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

使用建造者模式主要有以下效果:

1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。

模型图

 

 

 

角色

  在这样的设计模式中,有以下几个角色:

  1 builder:为创建一个产品对象的各个部件指定抽象接口。

  2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

  3 Director:构造一个使用Builder接口的对象。

  4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

例子

--------------------------------------------------------------------------------------------------------------------

package com.ludoPattren4life;
import java.util.ArrayList;
@SuppressWarnings("unchecked")
public class Director {
private ArrayList<String> sequence = new ArrayList();
private BenzBuilder benzBuilder = new BenzBuilder();
private BMWBuilder bmwBuilder = new BMWBuilder();
public BenzModel getABenzModel(){
this.sequence.clear();
this.sequence.add("start");
this.sequence.add("stop");
this.benzBuilder.setSequence(this.sequence);
return (BenzModel)this.benzBuilder.getCarModel();
}
public BenzModel getBBenzModel(){
this.sequence.clear();
this.sequence.add("engine boom");
this.sequence.add("start");
this.sequence.add("stop");
this.benzBuilder.setSequence(this.sequence);
return (BenzModel)this.benzBuilder.getCarModel();
}
public BMWModel getCBMWModel(){
this.sequence.clear();
this.sequence.add("alarm");
this.sequence.add("start");
this.sequence.add("stop");
this.bmwBuilder.setSequence(this.sequence);
return (BMWModel)this.bmwBuilder.getCarModel();
}
public BMWModel getDBMWModel(){
this.sequence.clear();
this.sequence.add("start");
this.bmwBuilder.setSequence(this.sequence);
return (BMWModel)this.bmwBuilder.getCarModel();
}
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
import java.util.ArrayList;
public abstract class CarModel {
private ArrayList<String> sequence = new ArrayList<String>();
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void enginBoom();
final public void run(){
for (int i=0;i<this.sequence.size();i++){
String actionName = this.sequence.get(i);
if(actionName.equalsIgnoreCase("start")){
this.start();
}else if(actionName.equalsIgnoreCase("stop")){
this.stop();
}else if(actionName.equalsIgnoreCase("alarm")){
this.alarm();
}else if(actionName.equalsIgnoreCase("engine boom")){
this.enginBoom();
}
}
System.out.println("-------------------------------------");
}
final public void setSequence(ArrayList<String> sequence){
this.sequence = sequence;
}
}
--------------------------------------------------------------------------------------------------------------------
 package com.ludoPattren4life;
public class BenzModel extends CarModel {
@Override
protected void alarm() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【喇叭】声音是这个样子的...");
}
@Override
protected void enginBoom() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【引擎】声音是这个样子的...");
}
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【奔跑】是这个样子的...");
}
@Override
protected void stop() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【停车】是这个样子的...");
}
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
public class BMWModel extends CarModel {
@Override
protected void alarm() {
// TODO Auto-generated method stub
System.out.println("宝马车的【喇叭】声音是这个样子的...");
}
@Override
protected void enginBoom() {
// TODO Auto-generated method stub
System.out.println("宝马车的【引擎】声音是这个样子的...");
}
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("宝马车的【奔跑】是这个样子的...");
}
@Override
protected void stop() {
// TODO Auto-generated method stub
System.out.println("宝马车的【停车】是这个样子的...");
}
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
import java.util.ArrayList;
public abstract class CarBuilder {
public abstract void setSequence(ArrayList<String> sequence);
public abstract CarModel getCarModel();
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
import java.util.ArrayList;
public class BenzBuilder extends CarBuilder {
private BenzModel benz = new BenzModel();
@Override
public CarModel getCarModel() {
// TODO Auto-generated method stub
return this.benz;
}
@Override
public void setSequence(ArrayList<String> sequence) {
// TODO Auto-generated method stub
this.benz.setSequence(sequence);
}
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
import java.util.ArrayList;
public class BMWBuilder extends CarBuilder {
private BMWModel bmw = new BMWModel();
@Override
public CarModel getCarModel() {
// TODO Auto-generated method stub
return this.bmw;
}
@Override
public void setSequence(ArrayList<String> sequence) {
// TODO Auto-generated method stub
this.bmw.setSequence(sequence);
}
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
import java.util.ArrayList;
public class Client {
public static void main(String[] args){
Director director  = new Director();
for (int i=0;i<2;i++){
director.getABenzModel().run();
}
for (int i=0;i<3;i++){
director.getBBenzModel().run();
}
for (int i=0;i<4;i++){
director.getCBMWModel().run();
}
}
}
--------------------------------------------------------------------------------------------------------------------
执行结果:
奔驰车的【奔跑】是这个样子的...
奔驰车的【停车】是这个样子的...
-------------------------------------
奔驰车的【奔跑】是这个样子的...
奔驰车的【停车】是这个样子的...
-------------------------------------
奔驰车的【引擎】声音是这个样子的...
奔驰车的【奔跑】是这个样子的...
奔驰车的【停车】是这个样子的...
-------------------------------------
奔驰车的【引擎】声音是这个样子的...
奔驰车的【奔跑】是这个样子的...
奔驰车的【停车】是这个样子的...
-------------------------------------
奔驰车的【引擎】声音是这个样子的...
奔驰车的【奔跑】是这个样子的...
奔驰车的【停车】是这个样子的...
-------------------------------------
宝马车的【喇叭】声音是这个样子的...
宝马车的【奔跑】是这个样子的...
宝马车的【停车】是这个样子的...
-------------------------------------
宝马车的【喇叭】声音是这个样子的...
宝马车的【奔跑】是这个样子的...
宝马车的【停车】是这个样子的...
-------------------------------------
宝马车的【喇叭】声音是这个样子的...
宝马车的【奔跑】是这个样子的...
宝马车的【停车】是这个样子的...
-------------------------------------
宝马车的【喇叭】声音是这个样子的...
宝马车的【奔跑】是这个样子的...
宝马车的【停车】是这个样子的...
-------------------------------------

package com.ludoPattren4life;
import java.util.ArrayList;
@SuppressWarnings("unchecked")
public class Director {
private ArrayList<String> sequence = new ArrayList();
private BenzBuilder benzBuilder = new BenzBuilder();
private BMWBuilder bmwBuilder = new BMWBuilder();
public BenzModel getABenzModel(){
this.sequence.clear();
this.sequence.add("start");
this.sequence.add("stop");
this.benzBuilder.setSequence(this.sequence);
return (BenzModel)this.benzBuilder.getCarModel();
}
public BenzModel getBBenzModel(){
this.sequence.clear();
this.sequence.add("engine boom");
this.sequence.add("start");
this.sequence.add("stop");
this.benzBuilder.setSequence(this.sequence);
return (BenzModel)this.benzBuilder.getCarModel();
}
public BMWModel getCBMWModel(){
this.sequence.clear();
this.sequence.add("alarm");
this.sequence.add("start");
this.sequence.add("stop");
this.bmwBuilder.setSequence(this.sequence);
return (BMWModel)this.bmwBuilder.getCarModel();
}
public BMWModel getDBMWModel(){
this.sequence.clear();
this.sequence.add("start");
this.bmwBuilder.setSequence(this.sequence);
return (BMWModel)this.bmwBuilder.getCarModel();
}
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
import java.util.ArrayList;
public abstract class CarModel {
private ArrayList<String> sequence = new ArrayList<String>();
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void enginBoom();
final public void run(){
for (int i=0;i<this.sequence.size();i++){
String actionName = this.sequence.get(i);
if(actionName.equalsIgnoreCase("start")){
this.start();
}else if(actionName.equalsIgnoreCase("stop")){
this.stop();
}else if(actionName.equalsIgnoreCase("alarm")){
this.alarm();
}else if(actionName.equalsIgnoreCase("engine boom")){
this.enginBoom();
}
}
System.out.println("-------------------------------------");
}
final public void setSequence(ArrayList<String> sequence){
this.sequence = sequence;
}
}
--------------------------------------------------------------------------------------------------------------------
package com.ludoPattren4life;
import java.util.ArrayList;
public abstract class CarModel {
private ArrayList<String> sequence = new ArrayList<String>();
protected abstract void start();
protected abstract void stop();
protected abstract void alarm();
protected abstract void enginBoom();
final public void run(){
for (int i=0;i<this.sequence.size();i++){
String actionName = this.sequence.get(i);
if(actionName.equalsIgnoreCase("start")){
this.start();
}else if(actionName.equalsIgnoreCase("stop")){
this.stop();
}else if(actionName.equalsIgnoreCase("alarm")){
this.alarm();
}else if(actionName.equalsIgnoreCase("engine boom")){
this.enginBoom();
}
}
System.out.println("-------------------------------------");
}
final public void setSequence(ArrayList<String> sequence){
this.sequence = sequence;
}
}
 package com.ludoPattren4life;
public class BenzModel extends CarModel {
@Override
protected void alarm() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【喇叭】声音是这个样子的...");
}
@Override
protected void enginBoom() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【引擎】声音是这个样子的...");
}
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【奔跑】是这个样子的...");
}
@Override
protected void stop() {
// TODO Auto-generated method stub
System.out.println("奔驰车的【停车】是这个样子的...");
}
}
--------------------------------------------------------------------------------------------------------------------

抱歉!评论已关闭.