1,生成器的模式的意图在于将一个复杂的构建与其标识相互分离,是的同样的构建过程可以创建不同的表示。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成不同的内部表象的产品。
2,生成器模式UML图:
-1,建造者IBuilder角色:给出一个抽象接口,以规范产品对象各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。可以在接口中只定义一个总的建造方法,再在子类总实现。这样子可以实现操作的隔离。
-2,具体建造者Builder角色:此角色实现建造者接口,此角色主要完成IBuilder中的各个接口,在各个建造步骤完成后,提供一个组合方法,返回产品实例。
-3,指导者Director角色:此角色调用具体建造者以创建产品对象。
-4,产品Product角色:对应业务产品。
3,具体代码如下:
/**
*
* @(#) IBuilder.java
* @Package pattern.chp04.builder
*
* Copyright © JING Corporation. All rights reserved.
*
*/
package pattern.chp04.builder;
/**
* 类描述:建造者接口
*
* @author: Jing
* @version $Id: Exp$
*
* History: Dec 19, 2014 11:11:16 AM Jing Created.
*
*/
public interface IBuilder {
/**
*
* 方法说明:生成产品对象
*
* Author: Jing
* Create Date: Dec 19, 2014 11:11:56 AM
*
* @return
* @return Product
*/
public Product create();
}
/**
*
* @(#) BuildProduct.java
* @Package pattern.chp04.builder
*
* Copyright © JING Corporation. All rights reserved.
*
*/
package pattern.chp04.builder;
/**
* 类描述:具体产品生成
*
* @author: Jing
* @version $Id: Exp$
*
* History: Dec 19, 2014 11:14:37 AM Jing Created.
*
*/
public class BuildProduct implements IBuilder {
Product model = new Product();
public Product create() {
createScreen();
createMainframe();
return model;
}
/**
*
* 方法说明:生成屏幕
*
* Author: Jing Create Date: Dec 19, 2014 11:15:28 AM
*
* @return void
*/
public void createScreen() {
model.setScreen("Screen Product");
}
/**
*
* 方法说明:生成主机
*
* Author: Jing Create Date: Dec 19, 2014 11:16:12 AM
*
* @return void
*/
public void createMainframe() {
model.setMainframe("Mainframe Product");
}
}
/**
*
* @(#) Product.java
* @Package pattern.chp04.builder
*
* Copyright © JING Corporation. All rights reserved.
*
*/
package pattern.chp04.builder;
/**
* 类描述:产品类,电脑
*
* @author: Jing
* @version $Id: Exp$
*
* History: Dec 19, 2014 11:12:12 AM Jing Created.
*
*/
public class Product {
/**
* 屏幕
*/
private String screen;
/**
* 主机
*/
private String mainframe;
/**
* @return the screen
*/
public String getScreen() {
return screen;
}
/**
* @param screen
* the screen to set
*/
public void setScreen(String screen) {
this.screen = screen;
}
/**
* @return the mainframe
*/
public String getMainframe() {
return mainframe;
}
/**
* @param mainframe
* the mainframe to set
*/
public void setMainframe(String mainframe) {
this.mainframe = mainframe;
}
}
/**
*
* @(#) Director.java
* @Package pattern.chp04.builder
*
* Copyright © JING Corporation. All rights reserved.
*
*/
package pattern.chp04.builder;
/**
* 类描述:产品生成指导类
*
* @author: Jing
* @version $Id: Exp$
*
* History: Dec 19, 2014 11:17:07 AM Jing Created.
*
*/
public class Director {
private IBuilder builder;
public Director(IBuilder builder) {
this.builder = builder;
}
/**
*
* 方法说明:构建产品
*
* Author: Jing
* Create Date: Dec 19, 2014 11:18:31 AM
*
* @return
* @return Product
*/
public Product build(){
return builder.create();
}
}
4, 在什么情况下使用建造者模式
以下情况应当使用建造者模式:
1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
使用建造者模式主要有以下效果:
1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。