构建者(builder) in Java

定义:建造者模式,又叫生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
适用性:

a.当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式.
b.当构建过程必须允许构造的对象有不同的表示.

构建者模式的核心思想:

将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。

建造者者模式有4个角色:

  • Product产品类:
    要构建的对象
  • Builder抽象构建者:
    定义操作接口
  • ConcreteBuilder具体建造者:
    实现Builder所有方法
  • Director导演类:
    每个观察者在接收到消息后的更新操作是不同的。

下面以参考文献里提到的造人来说明:
首先定义以下产品类person,本例的产品就是”人”了.

public class Person {


    private List<String> arms = new ArrayList<String>();

    private List<String> heads = new ArrayList<String>();

    private List<String> legs = new ArrayList<String>();

    private List<String> bodys = new ArrayList<String>();

    public Person(){
        System.out.println("person开始构建......");
    }

    @Override
    public String toString() {
        return "我有"+heads.size()+"个头,"+bodys.size()+"个身体,"+arms.size()+"个手臂,"+legs.size()+"个腿.";
    }

    //setter and getter ...
}

人嘛,一般都有头,身体,手臂,腿了.

下面是一个抽象的Builder:

public  abstract class Builder {

    protected Person person = new Person();

    public abstract void buildHead();
    public abstract void buildArm();
    public abstract void buildLeg();
    public abstract void buildBody();


    public abstract Person getPerson();
}

这里面定义了如何装配头,身体,手臂,腿的方法.
到这里,我可能想构建一个普通人:

public class HumanBuilder extends Builder {

    @Override
    public void buildHead() {
        person.getHeads().add("human head");
    }

    @Override
    public void buildArm() {
        person.getArms().add("human arm");
    }

    @Override
    public void buildLeg() {
        person.getLegs().add("human leg");
    }

    @Override
    public void buildBody() {
        person.getBodys().add("human body");
    }

    @Override
    public Person getPerson() {
        return person;  
    }
}

在这个类里,定义了实际的构建过程,需要注意的是各个部分可都是”human”的.
另外,我如果想构建另外一种人呢,比方奥特曼,那自然需要另外的一个Builder了.

public class UltramanBuilder extends Builder {

    @Override
    public void buildHead() {
        person.getHeads().add("ultraman head");
    }

    @Override
    public void buildArm() {
        person.getArms().add("ultraman arm");
    }

    @Override
    public void buildLeg() {
        person.getLegs().add("ultraman leg");
    }

    @Override
    public void buildBody() {
        person.getBodys().add("ultraman body");
    }

    @Override
    public Person getPerson() {
        return person;
    }
}

接下了,就是导演要出场了,到底是要一个普通人还是奥特曼呢,一切都是导演说了算.

public class PersonDirector {

    private Builder builder;

    public PersonDirector(Builder builder){
        this.builder = builder;
    }

    public Person createPerson(){
        builder.buildBody();
        builder.buildLeg();
        builder.buildLeg();
        if (builder instanceof HumanBuilder){
            builder.buildHead();
            builder.buildArm();
        }else if(builder instanceof UltramanBuilder){
            for(int i=0;i<3;i++){//3 head
                builder.buildHead();
            }
            for(int i=0;i<6;i++){//6 arms
                builder.buildArm();
            }

        }
        return builder.getPerson();
    }
}    

奥特曼可不像普通人一样,那可是有3头6臂的.

到这里构建者模式已经好了,到具体场景里用一下吧.

public class Client {
    public static void main(String[] args) {
        PersonDirector personDirector = null;
        Person person = null;
        Builder builder = null;
        builder = new HumanBuilder();
        personDirector = new PersonDirector(builder);
        person = personDirector.createPerson();
        System.out.println(person);

        builder = new UltramanBuilder();
        personDirector = new PersonDirector(builder);
        person = personDirector.createPerson();
        System.out.println(person);
    }
}

运行结果如下:

person开始构建......
我有1个头,1个身体,1个手臂,2个腿.
person开始构建......
我有3个头,1个身体,6个手臂,2个腿.

可见,不同的builder构建出的是不同的人.完全满足需要.

需要注意* 构建算法由Director来确定,Builder只负责提供装配接口.* 组成不见不能替换,比如普通人的头给奥特曼的头明显是不一样的.

Builder in Java:
在Java中有一个StringBuilder,看名字应该就知道了.

   //Client同时充当了Director的角色
   StringBuilder builder = new StringBuilder();
   builder.Append("www");
   builder.Append(".shenyanchao");
   builder.Append(".cn");
   //返回string对象:www.shenyanchao.cn
   builder.toString(); 



这中间没有了director,用client进行了代替.StringBuilder既是抽象接口又是具体构建者. 返回的字符串自然就是产品了. 这是一种简单的Builder模式.

参考文档: http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,Builder是一种设计模式,用于创建复杂对象的实例。它通过将对象的构建过程分解成一系列步骤来简化对象的创建。引用是一个示例,展示了一个AnimalBuilder接口,该接口定义了构建Animal对象的方法。它包括buildName()和buildSpeed()方法,以及builderAnimal()方法,用于返回构建完成的Animal对象。 引用是一个使用Builder模式创建User对象的示例。User类中包含一个静态的builder()方法,该方法返回一个Builder对象,通过链式调用方法来设置User对象的属性,最后通过build()方法来构建User对象。 引用展示了一个EagleBuilder类,它实现了AnimalBuilder接口。在EagleBuilder中,buildName()方法设置Animal对象的名称为"雄鹰",buildSpeed()方法设置Animal对象的速度为80,builderAnimal()方法返回构建完成的Animal对象。 引用是User类中的代码片段,其中包含一个静态的builder()方法,返回一个Builder对象,用于使用Builder模式创建User对象。 简而言之,Java中的Builder是一种用于创建复杂对象的设计模式,它通过将对象的构建过程分解成一系列步骤来简化对象的创建过程。通过使用Builder模式,可以使对象创建的代码更加清晰和可维护。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *3* [Java链式编程与Builder(建造者)设计模式](https://blog.csdn.net/weixin_52255395/article/details/131553891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *4* [Java 设计模式 --- Builder模式 Java Builder 模式](https://blog.csdn.net/HaHa_Sir/article/details/120105014)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值