• 公用技术——设计模式5——创建型模式——构建者模式


    1、概念

    与工厂模式大部分相同,区别在于工厂模式”封装”复杂的类结构,而构建者模式”封装”复杂的对象创建流程。

    这样做的目的是:

    1. 对于框架设计者而言,”封装”复杂的对象创建流程,使得框架使用者在使用这些对象时,无需关注”如何创建它”,而只需关注”如何使用它”。
    2. 对于接口规范制定者,可以规范对象的创建流程,而由不同厂商提供具体的实现。

    对于只需要通过new创建,或者直接可以使用spring框架获取的类,无需使用构建者模式。

    它的解决方案:

    • 对于框架设计者而言,通常将类名定义为XXBuilder,该类提供build方法,该方法的返回值为所需对象。
    • 对于第二种场景,接口规范制定者需要明确对象的创建流程,并将这些流程分解为一系列的方法。

    2、UML图

    3、代码

      构建者接口

    /**
     * 
     * @File Name: IBuilder.java
     * @Description: 构建者接口
     * @version 1.0
     * @since JDK 1.8
     */
    public interface IBuilder {
    	/**
    	 * 
    	 * @Title: step1
    	 * @Description:第一步
    	 */
    	void step1();
    
    	/**
    	 * 
    	 * @Title: step2
    	 * @Description:第二步
    	 */
    	void step2();
    
    	/**
    	 * 
    	 * @Title: step3
    	 * @Description:第三步
    	 */
    	void step3();
    
    	Product build();
    }
    

      接口实现类

    /**
     * 
     * @File Name: BuilderImpl.java 
     * @Description: 构建者接口实现类
     * @version 1.0
     * @since JDK 1.8
     */
    public class BuilderImpl implements IBuilder {
    
    	@Override
    	public void step1() {
    
    	}
    
    	@Override
    	public void step2() {
    
    	}
    
    	@Override
    	public void step3() {
    
    	}
    	
    	@Override
    	public Product build() {
    
    	}
    }

    4、讨论

       问题1:它的主要功能是什么?

      答:它的主要功能是”封装”在创建对象时的复杂流程。

      问题2:它与工厂模式的区别是什么?

      答:它与工厂模式的功能都是相同的,都是用于创建对象,本质在于程序抽象的现实问题的区别。

      举个示例,假设将框架设计者比作厨师,框架调用者比作饭店的顾客,此时作为调用者要做的事情只是打开菜单点餐,至于厨师的做饭过程不是我关心的。而作为厨师,顾客点餐之后,我需要准备食材,烧水,炒菜等一系列流程最终的产品就是顾客点的食物。构建者模式中,接口调用者不需了解对象复杂的创建流程,而只需要关注对象本身的功能即可。

      对于工厂模式,它是对复杂类结构的”封装”。举个示例,对于汽车,电脑等这些我并不关心每个部件从哪里来的,以及它是如何组装到一起的,我在乎的只是车的功能。工厂模式中,接口调用者无需关心对象组装的”细节”,而只需要关注对象本身的功能即可。

    5、示例

    • Quartz框架中的JobBuilder
    • Mybatis框架中的SqlSessionFactoryBuilder

    大部分名称以Builder结尾,有build方法基本都是构建者模式的例子。个人建议可以尝试制作蛋糕的流程模拟为Java程序。

  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/rain144576/p/9940921.html
Copyright © 2020-2023  润新知