Java 设计模式之 建造者模式

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

Android 源码中的 Builder 模式

AlertDialog.Builder,Android流行的图片加载库,以及Notification通知的实例化

new AlertDialog
   .Builder(this)
   .setTitle("标题")
   .setMessage("内容")
   .setNegativeButton("取消", new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog, int which) {
            //...
       }
   })
   .setPositiveButton("确定", new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog, int which) {
            //....
       }
   })
   .create()
   .show();

特点

  • 优点:

    • 良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成细节。
    • 建造者独立,容易扩展。
  • 缺点:

    • 会产生多余的Builder对象及Director对象,消耗内存。

应用场景

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

实现

public interface Builder {

  //创建部件A  比如创建汽车车轮
  void buildPartA(); 
  //创建部件B   比如创建汽车方向盘
  void buildPartB(); 
  //创建部件C   比如创建汽车发动机
  void buildPartC();
  //返回最后组装成品结果 (返回最后装配好的汽车)
  Product getResult();

}
//Director 类,负责制造
public class Director {

  private Builder builder;

  public Director( Builder builder ) { 
    this.builder = builder; 
  } 
  // 将部件partA partB partC最后组成复杂对象
  //这里是将车轮 方向盘和发动机组装成汽车的过程
  public void construct() { 
    builder.buildPartA();
    builder.buildPartB();
    builder.buildPartC();

  }

}

public class ConcreteBuilder implements Builder {

  Part partA, partB, partC; 
  public void buildPartA() {
    //这里是具体如何构建partA的代码
  }; 
  public void buildPartB() { 
    //这里是具体如何构建partB的代码
  }; 
   public void buildPartC() { 
    //这里是具体如何构建partB的代码
  }; 
   public Product getResult() { 
    //返回最后组装成品结果
  }; 
}

public interface Product { }//产品

public interface Part { }//部件

//调用
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder ); 

director.construct(); 
Product product = builder.getResult();
发布了245 篇原创文章 · 获赞 66 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/duoduo_11011/article/details/104358609