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

本文深入探讨了生成器模式的核心概念及其在创建复杂对象时的优越性,通过实例展示了如何利用该模式分离构建算法和部件构造,从而实现灵活且高效的对象创建流程。以保险合同构建为例,详细解析了如何通过生成器模式实现对象的组件化构建,确保每个步骤的清晰性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值