Builder 建造者模式


简介
 
       
 
       
建造者模式的概念:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示。
大概的意思,就是一套的构建过程可以有不同的产品(表示)出来。这些产品(表示)都按照这一套的构建过程被生产出来。

建造者模式通常包括以下这几个角色:
    1、Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类去实现。
    2、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
    3、Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
    4、Product:复杂对象。

定义了一个新的类来构建另一个类的实例,以简化复杂对象的创建。建造模式通常也使用方法链接来实现。
java.lang.StringBuilder#append()
java.lang.StringBuffer#append()
java.sql.PreparedStatement
javax.swing.GroupLayout.Group#addComponent()
作用:
(1)将构造逻辑提到单独的类中
(2)分离类的构造逻辑和表现

演示
 
      
 
      
一个典型的复杂对象
/**
 *  表示被构造的复杂对象。
 */
public class Productor {
    public String head;
    public String body;
    public String foot;
}

抽象的Builder,为创建一个Product对象的各个部件指定抽象接口。
/**
 *  抽象的Builder:为创建一个Product对象的各个部件指定抽象接口
 */
public interface IBuilder {
    void buildHead();
    void buildBody();
    void buildFoot();
    Productor buildPerson();
}
具体的建造者。对于客户端而言,只需要关心具体的建造者,无需关心产品内部构建流程。我如果需要其他的复杂产品对象,只需要选择其他的建造者,如果需要扩展,则只需要写一个新的builder就行。如果可以,这个建造者甚至可以用配置文件做,增加更多的扩展性。
/**
 *     继承Builder的具体的建造者。实现Builder的接口以构造和装配该产品的各个部件。
 */
public class ConcreteBuilder implements IBuilder {
    Productor person;
    public ConcreteBuilder() {
        person = new Productor();
    }
    // 在此创建出部件
    public void buildBody() {
        System.out.println( "建造男人的身体");
        person.body = "身体";
    }
    public void buildFoot() {
        System.out.println( "建造男人的脚");
        person.foot = "脚";
    }
    public void buildHead() {
        System.out.println( "建造男人的头");
        person.head = "头";
    }
    // 返回复杂产品对象
    public Productor buildPerson() {
        return person;
    }
}

这是导演,负责流程规范,在导演类中可以注入建造者对象。
/**
 * 构造一个使用Builder接口的对象。这是导演,负责流程规范,在导演类中可以注入建造者对象
 */
public class Director {
    private IBuilder builder;
    // 构造方法中传递builder
    public Director(IBuilder builder) {
        this.builder = builder;
    }
    // 这个方法用来规范流程,产品构建和组装方法
    public Productor construct() {
        builder.buildHead();
        builder.buildBody();
        builder.buildFoot();
        return builder.buildPerson();
    }
}

客户端使用
public class Test {
    public static void main(String[] args) {
        // 对于客户端而言,只需要关心具体的建造者,无需关心产品内部构建流程;如果需要扩展,则只需要写一个新的builder就行
        IBuilder builder = new ConcreteBuilder();
        // 把建造者注入导演
        Director director = new Director(builder);
        // 导演负责流程把控
        Productor person = director.construct();
        System.out.println(person.body);
    }
}





附件列表

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值