设计模式-builder(构建者模式)

最近学习 Mybatis 源码,看到里面用到了一些设计模式,所以抽取时间进行整理一下。

Mybatis 中使用了构建者模式创建 SqlSessionFactory,这里对构建者模式做一个示例,方便理解。

定义

将一个复杂对象的构造与它的表示分离,使同样的构造可以构造出不同的表示,这样的设计模式被称为构建者模式。

构建者模式要素

  1. 构建者
    1. 私有的构建对象
    2. 共有的为构建对象赋值的方法
    3. 共有的返回构建对象的方法
    4. 共有的静态创建构建者方法(非必需,调用也可以通过 new 来创建构建者)
  2. 构建的对象(被构建者)

示例

/**
 * 构建的对象
 */
@Data
public class Animal {
    private String eye;
    private String ears;
    private String nose;
    private String hair;
}
package com.winson;

/**
 * 构建者
 */
public class AnimalBuilder {

    //1、私有的构建的对象
    private Animal animal = new Animal();

    //4、共有的静态创建构建者方法(非必需,调用也可以通过 new 来创建构建者)
    public static AnimalBuilder builder() {
        return new AnimalBuilder();
    }
    
    //2、共有的为构建的对象赋值的方法
    public AnimalBuilder eye(String eye) {
        animal.setEye(eye);
        return this;
    }
    //共有的为构建的对象赋值的方法
    public AnimalBuilder ears(String ears) {
        animal.setEars(ears);
        return this;
    }
    //共有的为构建的对象赋值的方法
    public AnimalBuilder nose(String nose) {
        animal.setNose(nose);
        return this;
    }
    //共有的为构建的对象赋值的方法
    public AnimalBuilder hair(String hair) {
        animal.setHair(hair);
        return this;
    }
    
    //3、共有的返回构建的对象的方法
    public Animal build() {
        return animal;
    }
}
public class TestBuilderModel {
    /**
     * 将一个复杂对象的构造与它的表示分离,使同样的构造可以构造出不同的表示,这样的设计模式被称为构建者模式
     */
    @Test
    public void builderTest() {
        Animal animal = AnimalBuilder.builder().eye("blue").hair("yellow").build();
        LogFactory.get().info("=========== {} =========== ", JSON.toJSON(animal));
    }
}
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </dependency>

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.7.19</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.75</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

构建者与setter方法、构造方法的区别:

  1. 构造方法我们需要关注构造函数的传参顺序,而构建者模式不需要关心
  2. setter方法是先创建一个对象,然后再set值,在没有完全赋值完成之前,就可能会被其他地方使用
  3. 构建者模式,是必须等调用build方法后才会返回构建完成的对象

构建者模式与工厂模式的区别:

工厂模式是创建千篇一律的对象,而构建者模式是可以根据自身需求创建出自定义的对象。

参考:https://www.cnblogs.com/liconglong/p/14171549.html,感谢原作者。

posted @ 2022-03-14 22:02  温森  阅读(290)  评论(0编辑  收藏  举报