设计模式-----Builder模式

前言

近日,看到Myabtis中组件中SqlSessionFactory由SqlSessionFactoryBuilder().build()生成时,且采用Builder模式,遂记录学习之。

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

1、什么是Builder模式?

  (1)对于复杂的对象,如果只是用构造方法创建的话,构造方法中会存在很多的逻辑,那么我们可以一步步有秩序构建它,从而降低复杂度;

  (2)对于复杂的对象,使用者不必知道其内部是如何实现的清下,逐步构造需要的实例对象;

2、什么情况下使用Builder模式?

  (1)将一个复杂对象的构建与它的表示分离,即相同的构造过程可以有不同表示;

  (2)当有多个构造器且需要传入不同的参数表示不同的产品时(即可以弥补工厂模式等无法选择多参数的缺点)

  (3)传入参数情况比较灵活且复杂的情况,或者说一开始不需要明确参数的情况。

  (4)框架中很多Configuration配置都会用到Builder模式。

3、具体使用Builder例子

(1)以前经常通过不同构造器传入不同的参数构造不同复杂的对象,比如我们现在需要一个User的不同情况对象

  • 只有id和name
  • 有id、name、age
  • 有id、name、age、address
public class User {
    private int id;
    private String name;
    private int age;
    private String address;

    //不同的构造器传入不同的参数,创造不同的复杂的产品
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public User(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age= age;
        this.address = address;
    }

    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 getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

测试类这样编写:

public class Main {
    public static void main(String[] args) {
        //情况1:id、姓名
        User user = new User(1, "Zhangsan");
        //情况2:id、姓名、年龄
        User user2 = new User(2,"Lisi",22);
        //情况3:id、姓名、年龄、地址
        User user3 = new User(3,"Wangwu",23,"Beijing");
        //情况4:id与年龄不清楚,很容易混淆,必须得查看源码或者文档才能知道哪个参数位置id/年龄
        User user4 = new User(24,"Wangwu",24,"Beijing");
    }
}

OK,这样是没有问题的,但是会有以下弊端:

  • 就好比情况4。当传入的参数很多并且没有说明文档的情况下,之后阅读完源码后才能更好地使用。那么就有可能对源码进行修改,这样就违背了在应用中一个好的设计模块的原则,即设计模式中的开闭原则(Open-Closed Principle, OCP,对修改封闭)
  • 每种情况都得编写一个的构造器,没有一点的灵活度。再比如这里address属性是可选的,可以不传入,那么灵活度同样很低!

(2)接下来就使用Builder模式创建,注意:Builder主要采用Java静态内部类

/**
 * 利用Builer模式灵活面对复杂对象的创建
 * @author Lijian
 *
 */
public class User2 {
    private int id;
    private String name;
    private int age;
    private String address;

    private User2(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }
    static class Builder{
        private int id;
        private String name;
        private int age;
        private String address;
        //灵活选择参数
        public Builder setId(int id) {
            this.id = id;
            return this;
        }
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
        public Builder setAddress(String address) {
            this.address = address;
            return this;
        }
        public Builder setAge(int age) {
            this.age = age;
            return this;
        }
        //最后build返回User2对象
        public User2 build() {
            return new User2(this);
        }
    }
}

测试类:

public class Main {
    public static void main(String[] args) {
        //通过build创建了User2对象,之后通过setXXX方法可灵活初始化属性,最后build返回对象
        User2 user = new User2.Builder().setId(1).setName("Lijian").setAge(22).build();
        //情况1:id、姓名
        User2 user2 = new User2.Builder().setId(2).setName("Zhangsan").build();
        //情况2:id、姓名、年轻、地址
        User2 user3 = new User2.Builder().setId(2).setName("Lisi").build();
        //情况3:id与age很明显能区分
        User2 user4 = new User2.Builder().setId(23).setAge(23).build();
    }
}

通过setXXX()方法灵活选择参数,最后build()方法“闭合”返回对象。很适用于复杂对象的创建,此处让我想起Java8新特性中的Stream API(https://blog.csdn.net/mynewclass/article/details/80393308)的一个特点:懒加载。是的,有点“懒加载”的味道,不需要立马指定属性,也不会立马生效,之后最后的操作build()才会生效!

原文地址:https://www.cnblogs.com/jian0110/p/9393573.html

时间: 2024-10-30 03:08:31

设计模式-----Builder模式的相关文章

java设计模式--Builder模式

一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的实例: 当需要逐步获取对象的初始值时,可以使用Builder模式: 一.Builder模式角色 Builder:建造者,Builder角色负责定义用来生成实例的接口API,Builder角色中准备了用于生成实例的具体方法: ConcreteBuilder:具体的建造者,负责实现Builder接口的的类,定义了

设计模式——Builder模式

什么是Builder模式: 如果按照网上的定义,理解起来相对不是简单易懂,我们可以打个比方,当需要构建一个复杂的对象时,比如说要生成一辆汽车,那么我们就需要先生成出构成这辆汽车的各个部件如车轮,发动机,方向盘,后视镜等,然后再将这些部件组装起来,最终组装成一辆完整的车.Builder模式的精髓就是将部件的生产和最终的组装分离出来.这样代码的模块化更强,更易于维护. Builder模式举例: 1 定义一个Builder(建造)接口,声明"生产各个部件的方法以及组装各个部件的方法": pu

GOF设计模式——Builder模式

一.什么是Builder模式? builder模式,就好比一栋大楼,这栋大楼有很多个组件组成,但是这栋大楼只是一个各个组件结合起来的框架,每一栋大楼都有各自的特色,这些特色由它们实际情况决定.对于程序而言,这栋大楼就好比一个Builder抽象类,里面定义了很多组件方法,一个完整的功能离不开里面的每一个方法,具体实现依赖子类,只要继承这个抽象类,就可以根据组件方法组建起自己的"大楼". 二.Builder模式思想 Builder类:负责生成实例的接口,里面定义了用于生成实例的方法: Co

Android开发中无处不在的设计模式——原型模式

不知不觉这个系列已经写了三篇了,其实很早之前就想写设计模式了,只不过怕自己误人子弟没有提笔去写.后来在实际开发中,发现设计模式可以让一个开发人员融会贯通所学的知识,为了进一步巩固自己,就写下了这一些列文章.前面介绍了三个模式. Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 本篇文章介绍的模式其实很简单,即原型模式,按照惯例,先看定义. 用原型实例指定创建对象的种类,并通过拷贝

Android开发中无处不在的设计模式——策略模式

这个系列停更了好久了,差不多可以重新拿起来更一篇了,这篇文章主要介绍策略模式.在这之前,先温习一下前面介绍的4种模式. 设计模式很重要! 设计模式很重要! 设计模式很重要! 重要的事说三遍!!! Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 Android开发中无处不在的设计模式--原型模式 接着看下策略模式的定义 策略模式定义了一些列的算法,并将每一个算法封装起来,而且使它

设计模式初学者笔记:Builder模式

[作者:byeyear    Email:[email protected]    首发:cnblogs    转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七八遍,才敢说自己对其有了初步的了解.这比花在Abstract Factory上的时间长多了.如果GoF将Builder模式放在第一个讲,估计我就会把这本书归结成天书直接扔一边了. Builder模式的关键在于,将“要做什么”与“做出来”分离,将“如何装配”与“完成装配”分离: Director知道“要做

深入浅出设计模式 ------ Builder(生成器模式)

一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 二. 结构  三. 参与者 Builder : 为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder : 实现Builder的接口以构造和装配该产品的各个部件.定义并明确它所创建的表示.提供一个检索产品的接口. Director : 构造一个使用(聚合:has-a的关系)Builder接口的对象.如下文代码ChefDirector类. Product : 表示被构造的复杂对

一天一个设计模式——Builder建造者模式

一.模式说明 在现实世界中,当我们要构造一个大型工程时(建一个大楼),通常的做法是先建造工程的每个独立部分,然后再逐步构造完成(先打地基,再搭框架,最后逐层累造).在程序设计领域,构造一个复杂的类时(或一些具有类似结构的复杂类时),也可以采用类似的思想:如果要创建一个用于构造文档的类(或者是word,或者是html),虽然具体的文档有不同的结构,但是构造这些对象有相同的套路:创建标题,创建内容,创建条目,结束文档.Builder建造者模式就是用来构造复杂的类的. 二.模式类图 三.模式时序图 四

设计模式—建造者模式(Builder)

title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对象创建型模式.我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造者在根据设置建造出各个对象出来.建造者模式又可以称为生成器模式. 模式结构 一个标准的建造者模式包含如下角色: Builder:抽象建造者 ConcreteBuilder:具体建造者 Director