Java设计模式–建造者模式
- 定义
将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示 - 实现
1.经典
public class BuilderTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// ProductBuilder builder = new DefaultConcreteProductBuilder();
ProductBuilder builder = new SpacialConcreteProductBuilder();
Director director = new Director(builder);
Product makeProduct = director.makeProduct("productName", "companyName", "part1", "part2", "part3", "part4");
System.out.println(makeProduct);
}
}
class Product{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
public Product() {
}
public Product(String productName, String companyName, String part1, String part2, String part3, String part4) {
super();
this.productName = productName;
this.companyName = companyName;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
}
@Override
public String toString() {
return "Product [productName=" + productName + ", companyName=" + companyName + ", part1=" + part1 + ", part2="
+ part2 + ", part3=" + part3 + ", part4=" + part4 + "]";
}
}
interface ProductBuilder{
void builderProductName(String product);
void buildercompanyName(String company);
void builderpart1(String part1);
void builderpart2(String part2);
void builderpart3(String part3);
void builderpart4(String part4);
Product build();
}
class DefaultConcreteProductBuilder implements ProductBuilder{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
@Override
public void builderProductName(String product) {
// TODO Auto-generated method stub
this.productName=product;
}
@Override
public void buildercompanyName(String company) {
// TODO Auto-generated method stub
this.companyName=company;
}
@Override
public void builderpart1(String part1) {
// TODO Auto-generated method stub
this.part1=part1;
}
@Override
public void builderpart2(String part2) {
// TODO Auto-generated method stub
this.part2=part2;
}
@Override
public void builderpart3(String part3) {
// TODO Auto-generated method stub
this.part3=part3;
}
@Override
public void builderpart4(String part4) {
// TODO Auto-generated method stub
this.part4=part4;
}
@Override
public Product build() {
// TODO Auto-generated method stub
return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
}
}
class Director{
private ProductBuilder builder;
public Director(ProductBuilder builder) {
super();
this.builder = builder;
}
public Product makeProduct(String productName, String companyName, String part1, String part2, String part3, String part4) {
builder.builderProductName(productName);
builder.buildercompanyName(companyName);
builder.builderpart1(part1);
builder.builderpart2(part2);
builder.builderpart3(part3);
builder.builderpart4(part4);
Product build=builder.build();
return build;
}
}
class SpacialConcreteProductBuilder implements ProductBuilder{
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
@Override
public void builderProductName(String product) {
// TODO Auto-generated method stub
this.productName=product;
}
@Override
public void buildercompanyName(String company) {
// TODO Auto-generated method stub
this.companyName=company;
}
@Override
public void builderpart1(String part1) {
// TODO Auto-generated method stub
this.part1=part1;
}
@Override
public void builderpart2(String part2) {
// TODO Auto-generated method stub
this.part2=part2;
}
@Override
public void builderpart3(String part3) {
// TODO Auto-generated method stub
this.part3=part3;
}
@Override
public void builderpart4(String part4) {
// TODO Auto-generated method stub
this.part4=part4;
}
@Override
public Product build() {
// TODO Auto-generated method stub
return new Product(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
}
}
这是经典的实现方法,但是在实际应用中,有时候并没有这么复杂
- 变种(简易版本)
这里说明一下,我们希望Product的值创建出来就不希望改变,所以采用了final修饰
public class ProtectTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Product1 build = new Product1.Builder().productName("abc").companyName("mm").part2("ccc").build();
System.out.println(build);
}
}
class Product1{
private final String productName;
private final String companyName;
private final String part1;
private final String part2;
private final String part3;
private final String part4;
public Product1(String productName, String companyName, String part1, String part2, String part3, String part4) {
super();
this.productName = productName;
this.companyName = companyName;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
}
@Override
public String toString() {
return "Product1 [productName=" + productName + ", companyName=" + companyName + ", part1=" + part1 + ", part2="
+ part2 + ", part3=" + part3 + ", part4=" + part4 + "]";
}
static class Builder{//采用静态内部类,实现高聚合
private String productName;
private String companyName;
private String part1;
private String part2;
private String part3;
private String part4;
public Builder productName(String productName) {
this.productName=productName;
return this;//返回对象本身,实现链式编程
}
public Builder companyName(String companyName) {
this.companyName=companyName;
return this;
}
public Builder part1(String part1) {
this.part1=part1;
return this;
}
public Builder part2(String part2) {
this.part2=part2;
return this;
}
public Builder part3(String part3) {
this.part3=part3;
return this;
}
public Builder part4(String part4) {
this.part4=part4;
return this;
}
public Product1 build() {
return new Product1(this.productName,this.companyName,this.part1,this.part2,this.part3,this.part4);
}
}
}
-
应用场景
1.需要生成的对象具有复杂的内部结构
2.需要生成的对象内部属性本身相互依赖
3.与不可变对象配合使用 -
优点
1.建造者独立,易扩展
2.便于控制细节风险 -
Spring源码中的应用
-
1.org.springframework.web.servlet.mvc.method.RequestMappingInfo 2.org.springframework.beans.factory.support.BeanDefinitionBuilder