设计模式9--生成器模式(Builder)

生成器模式的本质:分离整体构建算法和部件构造

模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

package com;

public class Product {

}
package com;

public interface Builder {
       void buildPart1();
       void buildPart2();
       void buildPart3();
       Product getResult();
}
package com.impl;

import com.Builder; import com.Product;

public class ConcreteBuilder implements Builder {    private Product product = new Product();    @Override  public void buildPart1() {   System.out.println("生成部分1");

 }

 @Override  public void buildPart2() {   System.out.println("生成部分2");

 }

 @Override  public void buildPart3() {   System.out.println("生成部分3");

 }    @Override  public Product getResult() {   return product;  } }

package com;

public class Director {

	private Builder builder;
	
	public Director(Builder builder){
		this.builder = builder;
	}
	
	public void construct(){
		builder.buildPart1();
		builder.buildPart2();
		builder.buildPart3();
	}
	
}
import com.Director;
import com.Product;
import com.impl.ConcreteBuilder;

public class Client {
	public static void main(String[] args) {
		
		ConcreteBuilder builder = new ConcreteBuilder();
		
		Director director = new Director(builder);
		
		director.construct();
		
		Product product = builder.getResult();
	}
}
使用生成器模式创建复杂对象:
package com.impl;

public class InsuranceContract {
	
	private String contractId;
	private String personName;
	private String compnyName;
	private long beginDate;
	private long endDate;
	private String oherDate;
	
	private InsuranceContract(ContractBuiler builer){
		this.contractId = builer.contractId;
		this.personName = builer.personName;
		this.compnyName = builer.companyName;
		this.beginDate = builer.beginDate;
		this.endDate = builer.endDate;
		this.oherDate = builer.oherDate;
	}
	public static class ContractBuiler {
		private String contractId;
		private String personName;
		private String companyName;
		private long beginDate;
		private long endDate;
		private String oherDate;
		
		public ContractBuiler(String contractId,long beginDate,long endDate){
			this.contractId = contractId;
			this.beginDate = beginDate;
			this.endDate = endDate;
		}
		
		public ContractBuiler setPersonName(String personName){
			this.personName = personName;
			return this;
		}
		
		public ContractBuiler setCompnyName(String companyName){
			this.companyName = companyName;
			return this;
		}
		
		public ContractBuiler setOherDate(String oherDate){
			this.oherDate = oherDate;
			return this;
		}
		
		public InsuranceContract build(){
			if(contractId == null || "".equals(contractId)){
				throw new IllegalArgumentException("合同编号不能为空");
			}
			
			boolean signPerson = (personName != null && !"".equals(personName));
			boolean signCompany = (companyName != null && !"".equals(companyName));
			
			if(signPerson && signCompany){
				throw new IllegalArgumentException("一份保险合同不能同时与个人和公司签订");
			}
			
			if(!signPerson && !signCompany){
				throw new IllegalArgumentException("一份保险合同不能没有签订对象");
			}
			
			if(beginDate <= 0 ){
				throw new IllegalArgumentException("合同必须有保险开始生效的日期");
			}
			
			if(endDate <= 0){
				throw new IllegalArgumentException("合同必须有保险失效的日期");
			}
			
			if(endDate <= beginDate){
				throw new IllegalArgumentException("保险失效的日期必须大于保险生效的日期");
			}
			return new InsuranceContract(this);
		}
	}
	
	public void someOperation(){
		System.out.println("Now in Insurance Contract someOperation == " + this.contractId);
	}
}
import com.impl.InsuranceContract;

public class Client {
	public static void main(String[] args) {
		InsuranceContract.ContractBuiler builder = new InsuranceContract.ContractBuiler("001",12345L,67890L);
		InsuranceContract contract = builder.setPersonName("张三").setOherDate("test").build();
		contract.someOperation();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值