Java设计模式--建造者模式

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
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值