建造者模式Builder,大家应该不陌生,在ImageLoader中使用的就是Builder模式,这里就简单的为大家介绍一下Builder模式,如有不同见解,请提出功能学习,谢谢!
一、定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
二、使用场景
1、相同的方法,不同的执行顺序,产生不同的事件结果时
2、多个部件或零件,都可以装配到一个对象,但是产生的运行结果又不相同时
3、产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用,这个时候使用建造者模式非常适合
4、当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时
三、简单的User实例
1、封装Users实例
public class Users { private final String mFirstName;//必选 private final String mLastName;//必选 private final String mGender;//可选 private final int mAge;//可选 private final String mPhoneNumber;//可选 private String mContry; Users(UserBuilder builder) { mFirstName = builder.firstName; mLastName = builder.lastName; mGender = builder.gender; mAge = builder.age; mPhoneNumber = builder.phoneNumber; mContry = builder.contry; } public String getFirstName() { return mFirstName; } public String getLastName() { return mLastName; } public String getGender() { return mGender; } public int getAge() { return mAge; } public String getPhoneNumber() { return mPhoneNumber; } public String getContry() { return mContry; } public static class UserBuilder { private final String firstName;//必选 private final String lastName;//必选 private String gender;//可选 private int age;//可选 private String phoneNumber;//可选 private String contry;//可选 public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder gender(String gender) { this.gender = gender; return this; } public UserBuilder age(int age) { this.age = age; return this; } public UserBuilder phoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; return this; } //设置好的默认的值,用户只需要设置是否添加这个默认值 public UserBuilder contry(){ this.contry = "中国"; return this; } public Users build() { return new Users(this); } } }
2、代码中使用
Users build = new Users.UserBuilder("张", "三") .age(18) .gender("man") .phoneNumber("183551") .contry() .setOnClick("确定", new CallBack() { @Override public void callBack() { System.out.println("我是回调........."); } }) .build(); list.add(build); Users.UserBuilder builds = new Users.UserBuilder("李", "四"); builds.age(30); builds.gender("woman"); builds.phoneNumber("123456"); builds.contry(); builds.build(); list.add(builds.build());
优点:
1、良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成细节
2、建造者独立,容易扩展
缺点:
会产生多余的Builder对象,消耗内存
以上是Builder模式的简单介绍及使用,欢迎评论