设计模式(二)----建造者模式

概述

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

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。

角色

建造者模式通常包括下面几个角色:
1、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4、Product:要创建的复杂对象。

应用实例

Java中的StringBuilder

举例

package com.request;

import java.sql.Timestamp;
import java.util.Map;
import java.util.TreeMap;

/**
 * 支付订单类
 *
 * 
 *
 */
public class OrderRequest
{

    /*Product:构建一个相对比较复杂的request对象。*/
    
	/*商户订单流水号*/
	private String platformTradeId;
	/*商户订单时间*/
	private Timestamp platformTradeTime;
	/*订单金额*/
	private String tradeAmount;
	/*用户账号*/
	private String payAccountId;
	/*商品名称*/
	private String goodsName;

	private OrderRequest()
	{
		super();
	}

	public String getPlatformTradeId()
	{
		return platformTradeId;
	}

	public Timestamp getPlatformTradeTime()
	{
		return platformTradeTime;
	}

	public String getNotifyUrl()
	{
		return notifyUrl;
	}

	public String getTradeAmount()
	{
		return tradeAmount;
	}

	public String getPayAccountId()
	{
		return payAccountId;
	}

	public String getGoodsName()
	{
		return goodsName;
	}

    /*Builder 内部类实现Builder*/
	public static final class Builder
	{
		/*商户订单流水号*/
		private String platformTradeId;
		/*商户订单时间*/
		private Timestamp platformTradeTime;
		/*商户订单状态通知路径*/
		private String notifyUrl;
		/*订单金额*/
		private String tradeAmount;
		/*用户账号*/
		private String payAccountId;
		/*商品名称*/
		private String goodsName;


		public static Builder create()
		{
			return new Builder();
		}

	

		public Builder platformTradeId(String platformTradeId)
		{
			this.platformTradeId = platformTradeId;
			return this;
		}

		public Builder platformTradeTime(Timestamp platformTradeTime)
		{
			this.platformTradeTime = platformTradeTime;
			return this;
		}

		public Builder notifyUrl(String notifyUrl)
		{
			this.notifyUrl = notifyUrl;
			return this;
		}

		public Builder tradeAmount(String tradeAmount)
		{
			this.tradeAmount = tradeAmount;
			return this;
		}

		public Builder payAccountId(String payAccountId)
		{
			this.payAccountId = payAccountId;
			return this;
		}

		public Builder goodsName(String goodsName)
		{
			this.goodsName = goodsName;
			return this;
		}

        /*Director:这部分进行组装 */
		public OrderRequest build()
		{
			//check params
			Ensure.that(platformTradeId).isNotNullOrEmpty().orThrowParameterException("商户订单号不允许为空");
			
			Ensure.that(platformTradeTime).isNotNull().orThrowParameterException("商户订单时间不允许为空");
			Ensure.that(tradeAmount).isNotNullOrEmpty().orThrowParameterException("交易金额不允许为空");
			
			OrderRequest orderRequest = new OrderRequest();
			orderRequest.platformTradeId = this.platformTradeId;
			orderRequest.platformTradeTime = this.platformTradeTime;
			orderRequest.tradeAmount = this.tradeAmount;
			
			
			orderRequest.payAccountId = this.payAccountId;
			orderRequest.notifyUrl = this.notifyUrl;
			orderRequest.goodsName = this.goodsName;
			return orderRequest;
		}
	}
}

总结

建造者主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

其实说白了在使用的过程中在构造request的时候使用的最为频繁。就是在需要多个参数排列组合生成构造函数的时候,使用建造者是比较方便使用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值