生成器模式的本质:分离整体构建算法和部件构造
模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
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();
}
}