设计模式之builder模式

虽然网上各种模式有多种讲法,但我还是要自己学一遍,写一遍学习心得。

今天看effective java,第二个讲的就是多个参数采用构造器的方法,也就是builder模式。

其实一开始我不是很懂,虽然jdk中好多地方都用了builder模式,现在看着书,有种似曾相识的感觉。

首先有个前提:

所写的bean类中,有n属性。编写这个类时有两种主流方法

①:如果要采用传统的构造器,那就是要写n+1个构造方法,然后再写一堆set和get方法,想想确实有点麻烦。

而且不便于阅读。

②:不提供构造方法,而直接用get和set方法逐一的进行参数值设定。

这样的方式,吧构造过程被分到了几个调用中,很可能是的javabean处于不一致的状态。不能保证一致性。

可能需要程序员付出额外的努力来确保它的线程安全。

那么就进入正题,用builder模式来构造他。

下面先给出一段代码来顺便解释:

/**
 * 摘抄自effective java。
 * @author U-ANLA
 *
 */
public class NutritionFacts {
	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;
	
	public static class Builder{
		private final int servingSize;    //常量有两种初始化方式,记得。
		private final int servings;
		
		private int calories = 0;
		private int fat = 0;
		private int carbohydrate = 0;
		private int sodium = 0;
		
		public Builder(int servingSize,int servings){
			this.servings = servings;
			this.servingSize = servingSize;
		}
		
		public Builder calories(int val){
			this.calories = val;
			return this;
		}
		
		public Builder fat(int val){
			this.fat = val;
			return this;
		}
		
		public Builder carbohydrate(int val){
			this.carbohydrate = val;
			return this;
		}
		
		public Builder sodium(int val){
			this.sodium = val;
			return this;
		}
		
		public NutritionFacts build(){
			return new NutritionFacts(this);
		}
	}
	
	private NutritionFacts(Builder builder){
		this.servingSize = builder.servingSize;
		this.calories = builder.calories;
		this.servings = builder.servings;
		this.fat = builder.fat;
		this.carbohydrate = builder.carbohydrate;
		this.sodium = builder.sodium;
	}
	
	public static void main(String[] args) {
		NutritionFacts nutrition = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();
	}
}
其实嘛,我觉得一看代码就一目了然了。

与构造器想必,builder的优势在于,有多个可以有多个可变参数,因为都是用单独的方法来设置参数。

builder模式十分灵活,可以利用耽搁builder构建多个对象,

由于builder模式有一个都用到的方法,build,故又可以利用泛型从而写出一个通用的接口。

public interface Builder<T>{
	public T build();
}
这样的创建构造器的方法也有缺点,其中一个就是代码冗长,另外,必须先创建一个构造器。


简而言之,如果累的构造器或者静态工厂中具有多个参数,设计这种类时候,builder模式就是一种不错的选择,特别是当

大多数参数都是可选的时候,与传统的重叠构造器模式想必,使用builer模式的客户端代码将更加容易阅读和编写,构造器也比

javabean模式更加安全。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值