• 设计模式之美


    设计模式之美 - 生成器模式

    设计模式之美目录:https://www.cnblogs.com/binarylei/p/8999236.html

    Builder 模式,中文翻译为建造者模式构建者模式生成器模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    建造者模式的原理和代码实现非常简单,掌握起来并不难,难点在于应用场景。在学习生成器模式的过程中,思考如下两个问题:

    1. 直接使用构造函数或者配合 setter 方法就能创建对象,为什么还需要建造者模式来创建呢?
    2. 建造者模式和工厂模式都可以创建对象,那它们两个的区别在哪里呢?

    1. Builder 模式使用

    以 Spring BeanDefinitionBuilder 为例。AbstractBeanDefinition 的属性非常多,不同的创建方式需要填写不同的属性,为了方便创建对象,统一 BeanDefinition 的创建,提供了 BeanDefinitionBuilder 类链式创建对象。

    BeanDefinition bd = BeanDefinitionBuilder
                    .rootBeanDefinition(BeanA.class)
                    .addConstructorArgReference("beanB")
                    .getBeanDefinition();
    

    2. 什么时候使用生成器模式

    大多数时候,我们可以直接通过 new 或 setter 方式创建对象。如果一个类中有很多属性,为了避免构造函数的参数列表过长,影响代码的可读性和易用性,我们可以通过构造函数配合 set() 方法来解决。但是,如果存在下面情况中的任意一种,我们就要考虑使用建造者模式了。

    • 必填的属性有很多。如果构造函数中把这些必填属性太多,那构造函数就又会出现参数列表很长的问题。如果我们把必填属性通过 set() 方法设置,那校验这些必填属性是否已经填写的逻辑就无处安放了。

    • 类属性之间有约束关系。我们继续使用构造函数配合 set() 方法的设计思路,那这些依赖关系或约束条件的校验逻辑就无处安放了。

    • 创建不可变对象。也就是说,对象在创建好之后,就不能再修改内部的属性值,要实现这个功能,我们就不能在类中暴露 set() 方法。构造函数配合 set() 方法来设置属性值的方式就不适用了。


    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    30天敏捷结果(26): 如何解决问题
    30天敏捷结果(30):提升敏捷结果
    30天敏捷结果(27):做些有重要意义的事
    STM32笔记A
    嵌入式linux驱动开发入门总结
    2014年个人计划
    迄今为止见过最好的职业规划
    30天敏捷结果(28):撰写你的个人使命
    C语言深度解剖读书笔记
    基于 SQLite 数据库的 C# 实体模型的实现
  • 原文地址:https://www.cnblogs.com/binarylei/p/9000759.html
Copyright © 2020-2023  润新知