Builder模式

304 阅读4分钟

1.1 Builder模式介绍

Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。
因为一个复杂的对象又很多大量的组成u部分,如汽车,有车轮、方向盘、发动机,还有各种小零件等,如何将这些部件装配成一辆汽车,这个装配过程很漫长,也很复杂,对于这种情况,为了在构建过程中对外部隐藏实现细节,就可以使用Builder模式将部件和组装过程分离,是的构建过程和部件都可以自由扩展,两者之间的耦合也降到最低。

1.2 Builder模式的定义

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

1.3 Builder模式的使用场景

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

1.4 Builder模式的角色介绍

  • Product类 产品类----产品的抽象类;
  • Builder----抽象Builder类,规范产品的组建,一般是由子类实现具体的组建过程;
  • ConcreteBuilder----具体的Builder类;
  • Director----统一组装过程。

1.5 Builder模式的简单实现

a. 实例概况 背景:小成希望去电脑城买一台组装的台式主机
过程: 电脑城老板(Diretor)和小成(Client)进行需求沟通(买来打游戏?学习?看片?) 了解需求后,电脑城老板将小成需要的主机划分为各个部件(Builder)的建造请求(CPU、主板blabla) 指挥装机人员(ConcreteBuilder)去构建组件; 将组件组装起来成小成需要的电脑(Product)

b. 使用步骤 步骤1: 定义组装的过程(Builder):组装电脑的过程

public  abstract class Builder {  

//第一步:装CPU
//声明为抽象方法,具体由子类实现 
    public abstract void  BuildCPU();

//第二步:装主板
//声明为抽象方法,具体由子类实现 
    public abstract void BuildMainboard();

//第三步:装硬盘
//声明为抽象方法,具体由子类实现 
    public abstract void BuildHD();

//返回产品的方法:获得组装好的电脑
    public abstract Computer GetComputer();
}

步骤2: 电脑城老板委派任务给装机人员(Director)

public class Director{
    //指挥装机人员组装电脑
    public void Construct(Builder builder){
    builder. BuildCPU();
    builder.BuildMainboard();
    builder. BuildHD();
    }
 }

步骤3: 创建具体的建造者(ConcreteBuilder):装机人员

//装机人员1
  public class ConcreteBuilder extend  Builder{
    //创建产品实例
    Computer computer = new Computer();

    //组装产品
    @Override
    public void  BuildCPU(){  
       computer.Add("组装CPU")
    }  

    @Override
    public void  BuildMainboard(){  
       computer.Add("组装主板")
    }  

    @Override
    public void  BuildHD(){  
       computer.Add("组装主板")
    }  

    //返回组装成功的电脑
     @Override
      public  Computer GetComputer(){  
      return computer
    }  
}

步骤4: 定义具体产品类(Product):电脑

public class Computer{

    //电脑组件的集合
    private List<String> parts = new ArrayList<String>();

    //用于将组件组装到电脑里
    public void Add(String part){
    parts.add(part);
   }

    public void Show(){
          for (int i = 0;i<parts.size();i++){    
          System.out.println(“组件”+parts.get(i)+“装好了”);
          }
          System.out.println(“电脑组装完成,请验收”);
    }
}

步骤5: 客户端调用-小成到电脑城找老板买电脑

public class Builder Pattern{
  public static void main(String[] args){

//逛了很久终于发现一家合适的电脑店
//找到该店的老板和装机人员
  Director director = new Director();
  Builder builder = new ConcreteBuilder();

//沟通需求后,老板叫装机人员去装电脑
director.Construct(builder);

//装完后,组装人员搬来组装好的电脑
Computer computer = builder.GetComputer();
//组装人员展示电脑给小成看
computer.Show();
    }
}

结果输出

组件CUP装好了
组件主板装好了
组件硬盘装好了
电脑组装完成,请验收

通过上述这个常见的生活例子,我相信你已经完全明白了建造者模式的原理了!!

1.6 小结

Builer模式在Android开发中也较为常用,通常作为配置类的构建器将配置的结构和表示分离开来,同时也将配置从目标类中隔离出来,避免过多的setter方法。Buidler模式比较常见的实现形式是通过调用链实现,这样使得代码跟简洁、易懂。

优点:

  • 良好的封装性,使得建造者模式可以使客户端不必知道产品内部组成的细节
  • 建造者独立,容易扩展 缺点: 会产生多余的Builder对象及Director对象,消耗内存。