首页 > 技术文章 > 建造者模式(builder)

pqq-bk 2017-06-06 10:45 原文

定义:

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

实用范围:
  1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  2、当构造过程必须允许被构造的对象有不同表示时。
 
角色
  1、Builder:为创建一个产品对象的各个部件指定抽象接口。
  2、ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  3、Director:构造一个使用Builder接口的对象,指导构建过程。
  4、Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
   关系如图:
  
      
 例子:
  假设我们要构建一套手机实例,手机产品中要包含配套的手机、耳机、充电器;
   我们要构建的产品类如下(Product):
public class Phone {
   //手机适配器
    private TheCharger TheCharger;
    //手机耳机
    private Theheadset Theheadset;
    //手机
    private MobilePhone mobilePhone;
    
    //getset方法省略

  根据产品类对象的各个部件指定抽象接口(builder)。

public interface Builder {
    //充电器
    TheCharger getHuaWeiTheCharger();
    //耳机
    Theheadset getHuaWeiTheheadset();
    
   MobilePhone getmobilePhone();
}

  实现Builder的接口(ConcreteBuilder)

public class BuilderImpl implements Builder{

    public MobilePhone getmobilePhone() {
        return new MobilePhone();
    }

    public TheCharger getTheCharger() {
        return new TheCharger();
    }

    public Theheadset getTheheadset() {
        return new Theheadset();
    }

    
    
}

构造一个使用Builder接口的对象,指导构建过程(Director)。

public class Director {
    
private Builder builder;
    
    public Director(Builder builder) {
    this.builder=builder;
}
    public Phone construct(){
        Phone phone=new Phone();
        phone.setMobilePhone(builder.getmobilePhone());
        phone.setTheCharger(builder.getTheCharger());
        phone.setTheheadset(builder.getTheheadset());
        return phone;
    }
    

}

 

测试如下:

public class Test {
public static void main(String[] args) {
    
Director director=new Director(new BuilderImpl());

    Phone phone=director.construct();
    
}
}

细心的朋友或许已经发现,这种模式和抽象工厂模式很相似;但仔细分析,差别还是蛮大的,抽象工厂针对的是具体的那个产品(比如上例:用抽象工厂具体要生成到对象是耳机或充电器或手机),建造者模式针对的是组合后的产品(phone 类)。

 

推荐阅读