[设计模式-创建型]建造者(Builder)

时间:2021-08-14 22:01:07

概括

名称

Builder

结构

[设计模式-创建型]建造者(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.java

TestMain.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());
}

}

一言蔽之,就是不直接实例化需要的类,而是通过构造器构建。