• 设计模式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,感谢原作者。

  • 相关阅读:
    FusionSphere产品功能
    openstack各组件详解和通信流程
    素数、杨辉三角、封装结构和集合操作(16)——集合及操作
    素数、杨辉三角、封装结构和集合操作(15)——IPython使用和封装解构
    素数、杨辉三角、封装结构和集合操作(14)——杨辉三角单行覆盖解法
    线性数据结构(13)——求质数
    线性数据结构(12)——菱形、三角形、闪电打印和斐波那契数列计算
    线性数据结构(11)——九九乘法表详解
    Python元组与字符串操作(10)——冒泡法
    lvm调整卷大小
  • 原文地址:https://www.cnblogs.com/elnimo/p/16006282.html
Copyright © 2020-2023  润新知