Java设计模式--建造者模式

建造者模式(Builder Pattern):

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

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。

模式结构:
建造者模式通常包括下面几个角色:

Builder:抽象建造者
ConcreteBuilder:具体建造者
Director:指导者
Product:产品角色

  1. 建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
  2. 具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完成创建产品实例的过程。在建造过程完成后,提供产品的实例。
  3. 指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
  4. 产品(Product)角色:产品便是建造中的复杂对象。指导者角色是与客户端打交道的角色。指导者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。

实例演示
以游戏开发中人物的构造过程为例。在游戏中创建一个形象时,需要对每个部位进行创建。简化而言,需要创建头部,身体和四肢。

1、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;
    }
}

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

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

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

public class MainBuilder implements PersonBuilder{
    Person person;

    public MainBuilder() {
        person = new Person();//创建person对象,用于调用set方法
    }

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

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

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

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

}

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

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

}

5,测试

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

建造者模式的优点:

封装性: 使用建造者模式可以使客户端不必知道产品内部组成的细节

建造者独立,容易扩展: Builder之间是相互独立的,与其它的Builder无关,对系统的扩展非常有利。

便于控制细节风险: 模式所建造的最终产品更易于控制:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

建造者模式的使用场景

相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式,需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

建造者模式的注意事项

建造者模式关注的是的零件装配的顺序。这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。

  1. 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。

  2. 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。

  3. 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值