概括
名称 |
Builder |
结构 |
|
动机 |
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 |
适用性 |
|
解析
形象比喻:
BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞定,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)
建造模式:将对象的内部表象和对象的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 1.Builder
为创建一个Product对象的各个部件指定抽象接口。
2.ConcreteBuilder
实现Builder的接口以构造和装配该产品的各个部件。
定义并明确它所创建的表示。
提供一个检索产品的接口。
3.Director
构造一个使用Builder接口的对象。
4.Product
表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
实例
涉及的文件有
IProductBuilder.java
- SoftwareBuilder.java
Product.java
ProductDirector.javaTestMain.java
Product 是一个产品类,是一个简单的java bean, 包含一些属性及对应的set ,get 方法。
IProductBuilder和SoftwareBuilder, 构造器的接口和实现类, 定义有一些方法实例化特定的 Product。
ProductDirector 使用Builder并调用相关方法返回构造的Product.
/**
* @author oscar999
* @date 2013-7-18
* @version V1.0
*/
package designptn.builder;
public class Product {
private String head;
private String body;
private String foot;
/**
* @return the head
*/
public String getHead() {
return head;
}
/**
* @param head
* the head to set
*/
public void setHead(String head) {
this.head = head;
}
/**
* @return the body
*/
public String getBody() {
return body;
}
/**
* @param body
* the body to set
*/
public void setBody(String body) {
this.body = body;
}
/**
* @return the foot
*/
public String getFoot() {
return foot;
}
/**
* @param foot
* the foot to set
*/
public void setFoot(String foot) {
this.foot = foot;
}
}
/**
* @author oscar999
* @date 2013-7-18
* @version V1.0
*/
package designptn.builder;
public interface IProductBuilder {
void buildHead();
void buildBody();
void buildFoot();
Product buildProduct();
}
/**
* @author oscar999
* @date 2013-7-18
* @version V1.0
*/
package designptn.builder;
public class SoftwareBuilder implements IProductBuilder {
Product product;
public SoftwareBuilder(){
product = new Product();
}
@Override
public void buildHead() {
// TODO Auto-generated method stub
product.setHead("Software Head");
}
@Override
public void buildBody() {
// TODO Auto-generated method stub
product.setBody("Software Body");
}
@Override
public void buildFoot() {
// TODO Auto-generated method stub
product.setFoot("Software Foot");
}
@Override
public Product buildProduct() {
// TODO Auto-generated method stub
return product;
}
}
/**
* @author oscar999
* @date 2013-7-18
* @version V1.0
*/
package designptn.builder;
public class ProductDirector {
public Product constructProduct(SoftwareBuilder pb) {
pb.buildHead();
pb.buildBody();
pb.buildFoot();
return pb.buildProduct();
}
}
/**
* @author oscar999
* @date 2013-7-18
* @version V1.0
*/
package designptn.builder;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ProductDirector pd = new ProductDirector();
Product product = pd.constructProduct(new SoftwareBuilder());
System.out.println(product.getHead());
System.out.println(product.getBody());
System.out.println(product.getFoot());
}
}
一言蔽之,就是不直接实例化需要的类,而是通过构造器构建。