一、引言
关于设计模式已经是一个老话题了,但是作为新手的我每次都看完就忘了,所以这次一定要好好扎实的复习一番。今天继续讲建造者模式的第二讲。
二、设计模式是什么
这里就不讲了,不了解的同学看上一篇: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