建造者模式

建造者模式

建造者模式

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

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。

UML类图 & 组成

类图

代码示例

同样,你可以在github上看到源码

Product(要创建的复杂对象),建立一个人物对象Person

public class Person {  

    private String head;  
    private String body;  
    private String foot;  

    public String getHead() {  
        return head;  
    }  

    public void setHead(String head) {  
        this.head = head;  
    }  

    public String getBody() {  
        return body;  
    }  

    public void setBody(String body) {  
        this.body = body;  
    }  

    public String getFoot() {  
        return foot;  
    }  

    public void setFoot(String foot) {  
        this.foot = foot;  
    }  
}  

Builder(给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建):

public interface PersonBuilder {  
    void buildHead();  
    void buildBody();  
    void buildFoot();  
    Person buildPerson();//组装  
}  

ConcreteBuilder(实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例):

public class ManBuilder implements PersonBuilder {  

    Person person;  

    public ManBuilder() {  
        person = new Person();//创建一个person实例,用于调用set方法  
    }  

    public void buildBody() {  
        person.setBody("建造身体部分");  
    }  

    public void buildFoot() {  
        person.setFoot("建造四肢部分");  
    }  

    public void buildHead() {  
        person.setHead("建造头部部分");  
    }  

    public Person buildPerson() {  
        return person;//返回一个person实例  
    }  

}

Director(调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建):

public class PersonDirector {  
    public Person constructPerson(PersonBuilder pb) {  
        //按照 身体--->头部--->四肢 的顺序创建人物  
        pb.buildHead();  
        pb.buildBody();  
        pb.buildFoot();  
        return pb.buildPerson();  
    }  
}  

Client 测试:

public class Test {  
    public static void main(String[] args) {  
        PersonDirector pd = new PersonDirector();  
        Person person = pd.constructPerson(new ManBuilder());  
        System.out.println(person.getBody());  
        System.out.println(person.getFoot());  
        System.out.println(person.getHead());  
    }  
}  

优缺点

在全面解析完后,我来分析下其优缺点:

优点

  • 易于解耦 将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
  • 易于精确控制对象的创建 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
  • 易于拓展 增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。

    每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

缺点

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。