设计模式之Builder模式

2016-12-21  本文已影响28人  官先生Y

定义

separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

使用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果时。
  2. 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
  3. 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个使用建造者模式非常适合。
  4. 当初始化一个对象特别复杂时,如参数多,且很多参数有默认值。

Android应用场景

  1. android中的AlertDialog对话框的构建过程。
  2. Android的各种开源库,例如Retrofit的创建,OkHttp中OkHttpClient和Request。

Java应用场景

  1. 在MyBatis3中通过SqlSessionFactoryBuilder构建SqlSessionFactory对象

Builder模式代码实现

public class DoDoContact {
    private final int    age;
    private final int    safeID;
    private final String name;
    private final String address;
 
    public int getAge() {
        return age;
    }
 
    public int getSafeID() {
        return safeID;
    }
 
    public String getName() {
        return name;
    }
 
    public String getAddress() {
        return address;
    }
 
    public static class Builder {
        private int    age     = 0;
        private int    safeID  = 0;
        private String name    = null;
        private String address = null;
        // 构建的步骤
        public Builder(String name) {
            this.name = name;
        }
 
        public Builder age(int val) {
            age = val;
            return this;
        }
 
        public Builder safeID(int val) {
            safeID = val;
            return this;
        }
 
        public Builder address(String val) {
            address = val;
            return this;
        }
 
        public DoDoContact build() { // 构建,返回一个新对象
            return new DoDoContact(this);
        }
    }
 
    private DoDoContact(Builder b) {
        age = b.age;
        safeID = b.safeID;
        name = b.name;
        address = b.address;
 
    }
}

Builder模式总结

优点

  1. 良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节;
  2. 建造者独立,容易扩展;
  3. 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到;
  4. 构造过程使用了链式调用,代码简洁。

缺点

  1. 会产生多余的Builder对象增加内存消耗;
上一篇下一篇

猜你喜欢

热点阅读