多个构造参数考虑使用Builder构造器模式
2016-02-26 21:37
681 查看
对于有多个参数的类,我们一向习惯采用重载构造方法的模式,像这样
当需要多个构造参数时,我们必须按照顺序依次传入,如果参数更多,那么代码会很难写,并且难以阅读,如果读者想知道哪些参数是什么意思就必须很仔细地数着来探究参数的意义,如果顺序弄反了程序就会出错.
那么在多个构造参数时我们有第二种方法,即JavaBean模式,这种模式我们采用无参构造方法创建对象,并且提供get,set方法
这样弥补了重载多个构造方法的不足,创建实例变得更容易,并且代码也更易读.这种写法也有很严重的缺点,因为构造过程被分配到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.
第三种替代方法就是Builder模式,不直接生成想要的对象,而是在客户端利用所有必要的参数调用构造器,得到一个builder对象.然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数.最后,客户端调用无参的build方法来生成不可变的对象.
以上就完成了Builder的代码,代码十分易读.Builder模式十分灵活,可以利用单个builder构建多个对象,builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变.Android 上的AlertDialog便是采取这种写法来构建提示对话框的.
public class User { private String name; private int age; private String address; public User(String name) { super(); this.name = name; } public User(String name, int age) { super(); this.name = name; this.age = age; } public User(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } }
当需要多个构造参数时,我们必须按照顺序依次传入,如果参数更多,那么代码会很难写,并且难以阅读,如果读者想知道哪些参数是什么意思就必须很仔细地数着来探究参数的意义,如果顺序弄反了程序就会出错.
那么在多个构造参数时我们有第二种方法,即JavaBean模式,这种模式我们采用无参构造方法创建对象,并且提供get,set方法
/** User类 */ public class User { private String name; private int age; private String address; public User(String name) { super(); this.name = name; } public User(String name, int age) { super(); this.name = name; this.age = age; } public User(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } public String getName() { return name; } public User() { super(); } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public static void main(String[] args) { } }
这样弥补了重载多个构造方法的不足,创建实例变得更容易,并且代码也更易读.这种写法也有很严重的缺点,因为构造过程被分配到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.
第三种替代方法就是Builder模式,不直接生成想要的对象,而是在客户端利用所有必要的参数调用构造器,得到一个builder对象.然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数.最后,客户端调用无参的build方法来生成不可变的对象.
/** User类 */ public class User { private String name; private int age; private String address; public static class Builder { // 必要参数 private String name; // 可选参数 private int age; private String address; public Builder(String name) { this.name = name; } //调用setter方法后必须返回对象本身,已完成后续调用 public Builder setAge(int age) { this.age = age; return this; } public Builder setAddress(String address) { this.address = address; return this; } // 调用无参方法生成示例 public User build() { return new User(this); } } public User(Builder builder) { name = builder.name; age = builder.age; address = builder.address; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", address=" + address + "]"; } public static void main(String[] args) { User user = new User.Builder("dong").setAge(25).setAddress("shenzhen").build(); System.out.println(user.toString()); } }
以上就完成了Builder的代码,代码十分易读.Builder模式十分灵活,可以利用单个builder构建多个对象,builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变.Android 上的AlertDialog便是采取这种写法来构建提示对话框的.
相关文章推荐
- IOS-OC-基本控件之UIPageControl
- IOS-OC-基本控件之UIPageControl
- iOS-OC-基本控件之UIPageControl
- UIDatePicker
- 图解Spark Transformation算子
- 动态树(Link Cut Tree) :SPOJ 375 Query on a tree
- <LeetCode OJ> 96. Unique Binary Search Trees
- Google推出iOS功能性UI测试框架EarlGrey
- 使用selenuim自动操作浏览器
- 1003_Fibonacci Sequence
- [Locked] Closest Binary Search Tree Value & Closest Binary Search Tree Value II
- 简单方式处理特效UI夹层
- iPhone开发之实现UITableView多选删除功能详解
- Java并发-类库新组件 - PriorityBlockingQueue 理解
- NGUI层级深度理解总结
- 设置UITableViewCell分割线顶格
- iOS UI-popoverController
- Cocoa Touch事件处理流程--响应者链
- 9. UIActionSheet
- 树状数组 + 位运算 LA 4013 A Sequence of Numbers