建造者模式

概念:给出一个接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。用户只需指定需要建造的类型就可以获得对象,建造过程及细节不需要了解。

应用场景:

  1. 需要生成的对象具有复杂的内部结构
  2. 需要生成的对象内部属性本身相互依赖,但是步骤的顺序不一定固定
  3. 把复杂对象的创建和使用分离

优点:

  1. 封装性好,创建和使用分离。
  2. 扩展性好,建造类之间独立、一定程度上解耦。

缺点:

  1. 产生多余的Builder对象。
  2. 产品内部发生变化,建造都要修改,成本较大。

与工厂模式的区别:

  1. 建造者模式更加关注于零部件装配的顺序;工厂模式注重于创建对象。
  2. 创建对象的力度不同,创建者模式创建复杂对象,由各种复杂的部件组成,工厂模式创建出来的都一样。
  3. 关注点:工厂模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出这个对象,还要知道这个对象由哪些部件组成。
  4. 建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样。

 

实例:

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

public interface PersonBuilder {
    void builderHead();

    void builderBody();

    void builderFoot();

    Person builderPerson();
}

public class ManBuilder implements PersonBuilder {
    private Person person;

    public ManBuilder() {
        person = new Person();
    }

    public void builderHead() {
        person.setHead("头:美国人鼻子尖蓝眼睛");
    }

    public void builderBody() {
        person.setBody("身体:块头大");
    }

    public void builderFoot() {
        person.setFoot("尾:腿长");
    }

    public Person builderPerson() {
        return person;
    }
}

public class PersonDirector {
    public Person createPerson(PersonBuilder personBuilder) {
        personBuilder.builderHead();
        personBuilder.builderBody();
        personBuilder.builderFoot();
        return personBuilder.builderPerson();
    }

    public static void main(String[] args) {
        PersonDirector personDirector = new PersonDirector();
        Person person = personDirector.createPerson(new ManBuilder());
        System.out.println(person.getHead() + person.getBody() + person.getFoot());
    }
}

通过上述代码,可以看出,其实就是将目标对象拆解成各个部分,通过一个接口抽象出需要创建哪些部分,最后通过这个接口的实现类,给各个部分赋值,并返回完整的目标对象。举个例子,就相当于网络游戏里的装备栏,个人装备有头盔,衣服,裤子,武器等等,将这些部分通过一个建造者把他们组装成一个整体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值