资讯专栏INFORMATION COLUMN

Java设计模式之builder模式

lindroid / 689人阅读

摘要:代码实例我们通常构造一个有很多参数的对象时有三种方式构造器重载,模式和模式。很明显这种构造器重载的方式对于多属性的情况是不完美的。方式方式就是提供方法,在使用的时候根据需求先调用无参构造器再调用方法填充属性值。

Java设计模式之builder模式

今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的。再次整理一下什么是builder模式以及应用场景。

1. builder简介

builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。

2. 代码实例

我们通常构造一个有很多参数的对象时有三种方式:构造器重载,JavaBeans模式和builder模式。通过一个小例子我们来看一下builder模式的优势。

2.1 构造器重载方式
package com.wangjun.designPattern.builder;

public class Product {
    
    private int id;
    private String name;
    private int type;
    private float price;
    
    public Product() {
        super();
    }
    
    public Product(int id) {
        super();
        this.id = id;
    }

    public Product(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public Product(int id, String name, int type) {
        super();
        this.id = id;
        this.name = name;
        this.type = type;
    }

    public Product(int id, String name, int type, float price) {
        super();
        this.id = id;
        this.name = name;
        this.type = type;
        this.price = price;
    }

}

使用构造器重载我们需要定义很多构造器,为了应对使用者不同的需求(有些可能只需要id,有些需要id和name,有些只需要name,......),理论上我们需要定义2^4 = 16个构造器,这只是4个参数,如果参数更多的话,那将是指数级增长,肯定是不合理的。要么你定义一个全部参数的构造器,使用者只能多传入一些不需要的属性值来匹配你的构造器。很明显这种构造器重载的方式对于多属性的情况是不完美的。

2.2 JavaBeans方式
package com.wangjun.designPattern.builder;

public class Product2 {
    
    private int id;
    private String name;
    private int type;
    private float price;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }

}

JavaBeans方式就是提供setter方法,在使用的时候根据需求先调用无参构造器再调用setter方法填充属性值。

Product2 p2 = new Product2();
p2.setId(10);
p2.setName("phone");
p2.setPrice(100);
p2.setType(1);

这种方式弥补了构造器重载的不足,创建实例很容易,代码读起来也很容易。但是,因为构造过程被分到了几个调用中,在构造过程中JavaBeans可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性。

2.3 builder模式
package com.wangjun.designPattern.builder;

public class Product3 {
    
    private final int id;
    private final String name;
    private final int type;
    private final float price;
    
    private Product3(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.type = builder.type;
        this.price = builder.price;
    }
    
    public static class Builder {
        private int id;
        private String name;
        private int type;
        private float price;
        
        public Builder id(int id) {
            this.id = id;
            return this;
        }
        public Builder name(String name) {
            this.name = name;
            return this;
        }
        public Builder type(int type) {
            this.type = type;
            return this;
        }
        public Builder price(float price) {
            this.price = price;
            return this;
        }
        
        public Product3 build() {
            return new Product3(this);
        }
    }

}

可以看到builder模式将属性定义为不可变的,然后定义一个内部静态类Builder来构建属性,再通过一个只有Builder参数的构造器来生成Product对象。Builder的setter方法返回builder本身,以便可以将属性连接起来。我们就可以像下面这样使用了。

Product3 p3 = new Product3.Builder()
                            .id(10)
                            .name("phone")
                            .price(100)
                            .type(1)
                            .build();

当然具体使用builder的情况肯定没有这么简单,但是思路大致一样:先通过某种方式取得构造对象需要的所有参数,再通过这些参数一次性构建这个对象。比如MyBatis中SqlSessionFactoryBuilder就是通过读取MyBatis的xml配置文件来获取构造SqlSessionFactory所需要的参数的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77256.html

相关文章

  • 一天一个设计模式JS实现——建造者模式

    摘要:参考文章设计模式之建造者模式一什么是建造者模式建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 参考文章:java设计模式之建造者模式 一、什么是建造者模式建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓...

    boredream 评论0 收藏0
  • 《源码中的设计模式建造者模式——链式调用

    摘要:上期原型模式发布以后,收到了粉丝的感谢,一条创作的动力更足了。今天我们一块看一下建造者模式,同样是创建型设计模式。为我们提供了建造者模式的快速实现,要应用到实际编码中。 ...

    wind3110991 评论0 收藏0
  • Java设计模式-建造者模式

    摘要:在建造者模式比较庞大时,导演类可以有多个。该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计的最初目标。源码地址参考文献设计模式之禅 定义 Separate the construction of a complex object from its representation so that the same...

    txgcwm 评论0 收藏0
  • 设计模式建造者模式

    摘要:建造者实现抽象类的所有未实现的方法,具体来说一般是两项任务组建产品返回组建好的产品。 0x01.定义与类型 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道 类型:创建型 实现建造模式的两种方式 1.抽象建造者 UML: showImg(https://segmentfault.co...

    banana_pi 评论0 收藏0
  • 深入理解建造者模式 ——组装复杂的实例

    摘要:而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。最后通过一个套餐实例,介绍了建造者模式在实例中的基本使用手段。 历史文章回顾: 设计模式专栏 深入理解单例模式 深入理解工厂模式 历史优质文章推荐: 分布式系统的经典基础理论 可能是最漂亮的Spring事务管理详解 面试中关于Java虚拟机(jvm)的问题看这篇就够了 无论是在现实世界中还是在软件...

    sanyang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<