设计模式之Builder模式
前两天,看的Google Collections 的集合组件,看了源代码,发现很多东西都是使用builder来创建,今天也上网查了些东西学习学习,发现多看看开源的源代码还是挺有好处的。今天模仿着Google Collections里面的东东写了一个Demo,呵呵,和标准的Builder模式写法不太相同,不过思想是一样的。贴个Demo程序就好了,模拟一个Bean对象的创建。
//Builder模式的角色:[Product]要生产的最终物品 /** * 用户对象 */ public class User { // 用户名 private String userName; // 用户密码 private String password; // 用户姓名 private String name; // 可看做[Director] 产流水线,负责产品的生产和组织 private User(Builder builder){ this.userName = builder.userName; this.password = builder.password; this.name = builder.name; } //getter方法 public String getUserName() { return userName; } public String getPassword() { return password; } public String getName() { return name; } // Builder模式的角色:[Builder]能进行生产的工作和获得生产的结果 /** * 创建该用户的建立者 * @param userName 用户名 * @return Builder对象 */ public static Builder builder(String userName){ return new Builder(userName); } // 创建者对象 public static final class Builder{ // Builder模式的角色:[Part]产品的基本组成部分 //用户名无法更改 private final String userName ; //密码 private String password; //真实姓名 private String name; //创建对象时必须指定用户名 public Builder(String userName){ this.userName = userName; } /** * 设置密码 * @param password 密码 * @return Builder对象 */ public Builder setPassword(String password){ this.password = password; return this; } /** * 设置姓名 * @param name 真实姓名 * @return Builder对象 */ public Builder setName(String name){ this.name = name; return this; } /** * 创建用户对象 * @return 用户对象 */ public User build(){ //这里在创建对象之前可以进行验证性操作, //而单纯的Bean对象不能进行验证性操作. //普通的做法:User user = new User(); user.setXXX()... //普通的做法使得创建对象和对对象的赋值操作分离开来 //如果用户名为空,则无法创建该对象 if(userName == null || userName.isEmpty()){ throw new IllegalArgumentException("用户名为空,无法创建对象"); } return new User(this); } } }
看Builder创建过程:
public class Test { public static void main(String[] args) { User.Builder builder = User.builder("cst"); builder.setName("chenshuting"); builder.setPassword("123"); User user = builder.build(); System.out.println(user.getUserName()); System.out.println(user.getPassword()); System.out.println(user.getName()); } }
继续学习ing~~~~