Java学习笔记---设计模式之建造者模式(二)

一、引言

        关于设计模式已经是一个老话题了,但是作为新手的我每次都看完就忘了,所以这次一定要好好扎实的复习一番。今天继续讲建造者模式的第二讲。

二、设计模式是什么

        这里就不讲了,不了解的同学看上一篇:Java学习笔记---设计模式之建造者模式(一)

三、建造者模式的另一种实现方式

       在讲如何实现之前,我们先看看下面的代码:

       当一个类包含大量的属性的类,就像下面这个类,有很多final属性:

package designModeBuilderOther;

public class User {

	private final String firstName;  //req
	
	private final String lastName;   //req
	
	private final int age;  //op
		
	……

       其中req表示必须要实现的属性,op表示可选项,该怎么实现呢,这里有个方法,多类型构造函数:

	public User(String firstName,String lastName, int age){
		this.firstName=firstName;
		this.lastName=lastName;
		this.age=age;
	}
	public User(String firstName,String lastName){
		this(firstName,lastName,0);
	}
}
       这样的多类型构造函数的方式可以使这个类正常工作,然而这种方式的麻烦是,当属性增多时,就得需要更多的构造函数。因此这不是最好的选择。

       还有一种就是我们可以用geter和seter函数来实现,只需要去掉属性前面的final修饰符,如下:

	private  String firstName;  //req
	
	private  String lastName;   //req
	
	private  int age;  //op

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
        这种方式似乎看着很简单,但是却存在一个问题,我们如何确保必须的属性被初始化了呢?如果我们不调用完所有的seter方法,就无法得到类的完整状态。而且User是易变的。

       我们看看第三种选择,建造者模式。解决方案类似如下所示:

        private  final String firstName;  //req
	
	private  final String lastName;   //req
	
	private  final int age;  //op

	public String getFirstName() {
		return firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public int getAge() {
		return age;
	}
	
	private User(UserBuilder builder){
		this.firstName=builder.firstName;
		this.lastName=builder.lastName;
		this.age=builder.age;
	}
	
	public static class UserBuilder{
		
		private final String firstName;
		
		private final String lastName;
		
		private int age;
		
		public UserBuilder(String firstName,String lastName){
			this.firstName=firstName;
			this.lastName=lastName;
		}
		public UserBuilder age(int age){
			this.age=age;
			return this;
		}
		public User build(){
			return new User(this);
		}
		
	}
	
}
(1)User构造方法是私有的,这就意味着该类不能在客户端代码里直接实例化。

(2)该类现在又是不可变的了,所有属性都是final类型,在构造方法里被赋值,不用担心类的状态被篡改,而且我们提供了getter的方法获取属性。

(3)builder类的构造方法只接受必须属性;

(4)builder类为不必要的属性提供了初始化接口。
别的客户端怎么使用呢?看看下面的代码:

package designModeBuilderOther;

public class TestUser {

	public static void main(String args[]){
		User user = new User.UserBuilder("优顾", "炒股")
							.age(2)
							.build();
		
		System.out.println(user.getFirstName()+user.getLastName()+user.getAge());
	}
	
}

是不是看着很舒服,也很想自己写一段的感觉,那就动起来。看看运行结果:

优顾炒股2

四、总结

        想必第一种建造者模式,我觉着第二种似乎更使用,在Android应用开发中,第二种似乎又用到很多,比如Dialog等一些控件的创建。所以掌握这种设计模式还是很有用的。

        感谢网友的文章,让我更好的认识了建造者模式。参考地址:http://www.importnew.com/11506.html







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值