• 死磕设计模式—建造者模式


    前言(八问知识体系)

    1.1.简介

    • 什么是建造模式?
      • 1.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
      • 2.建造者模式是一步一步创建一个复杂的对象,建造者模式注重的是一步一步的创建复杂对象。这个和工厂模式存在区别
    • 建造模式的优缺点?
      • 优点
        • 1.将产品本身和其创建过程解耦,用户不需要知道内部组成的细节
        • 2.具体的建造者完全独立,使用不同的具体建造者生产不同的对象
        • 3.增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”
      • 缺点
        • 1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式
        • 2.如果产品内部变化很复杂,则需要大量的具体建造者,会导致系统更加庞大

    1.2.类图

    1.3.代码示例

    抽象的产品建造流程

     1 public interface IBuilder {
     2 
     3     /**
     4      * buildPart1
     5      *
     6      * @description 建造产品的第一部分
     7      * @author luokangyuan
     8      * @date 2019/10/27 17:15
     9      * @version 1.0.0
    10      */
    11     void buildPart1();
    12 
    13     /**
    14      * buildPart2
    15      *
    16      * @description 建造产品的第二部分
    17      * @author luokangyuan
    18      * @date 2019/10/27 17:15
    19      * @version 1.0.0
    20      */
    21     void buildPart2();
    22 
    23     /**
    24      * buildPart3
    25      *
    26      * @description 建造产品的第三部分
    27      * @author luokangyuan
    28      * @date 2019/10/27 17:15
    29      * @version 1.0.0
    30      */
    31     void buildPart3();
    32 
    33     /**
    34      * build
    35      *
    36      * @description 得到产品
    37      * @return 产品
    38      * @author luokangyuan
    39      * @date 2019/10/27 17:16
    40      * @version 1.0.0
    41      */
    42     Product build();

    具体的建造者

     1 public class TruckConcreateBuilder implements IBuilder{
     2 
     3     private Product product = new Product();
     4     @Override
     5     public void buildPart1() {
     6         product.setPart1("货车轮胎完成");
     7     }
     8 
     9     @Override
    10     public void buildPart2() {
    11         product.setPart2("货车发动机完成");
    12     }
    13 
    14     @Override
    15     public void buildPart3() {
    16         product.setPart3("货车车架完成");
    17     }
    18 
    19     @Override
    20     public Product build() {
    21         return product;
    22     }
    23 }
    24 public class ConcreteBuilder implements IBuilder {
    25     private Product product = new Product();
    26 
    27     @Override
    28     public void buildPart1() {
    29         product.setPart1("轮胎完成");
    30     }
    31 
    32     @Override
    33     public void buildPart2() {
    34         product.setPart2("发动机完成");
    35     }
    36 
    37     @Override
    38     public void buildPart3() {
    39         product.setPart3("车架完成");
    40     }
    41 
    42     @Override
    43     public Product build() {
    44         return product;
    45     }
    46 }

    指挥者

     1 @AllArgsConstructor
     2 @Data
     3 public class Conductor {
     4 
     5     private IBuilder builder;
     6 
     7     /**
     8      * construct
     9      *
    10      * @description 指挥者负责产品的创建流程
    11      * @return 产品
    12      * @author luokangyuan
    13      * @date 2019/10/27 19:13
    14      * @version 1.0.0
    15      */
    16     public Product construct() {
    17         builder.buildPart1();
    18         builder.buildPart2();
    19         builder.buildPart3();
    20         return builder.build();
    21     }
    22 }

    产品

     1 @Data
     2 public class Product {
     3 
     4     /* 组成产品的第一部分*/
     5     private String part1;
     6 
     7     /* 组成产品的第一部分*/
     8     private String part2;
     9 
    10     /* 组成产品的第一部分*/
    11     private String part3;
    12 }

    客户端调用

    1 public static void main(String[] args) {
    2     IBuilder builder = new ConcreteBuilder();
    3     Conductor conductor = new Conductor(builder);
    4     Product product = conductor.construct();
    5     log.info("产品信息:{},{},{}", product.getPart1(), product.getPart2(),product.getPart3());
    6     conductor.setBuilder(new TruckConcreateBuilder());
    7     Product truck = conductor.construct();
    8     log.info("产品信息:{},{},{}", truck.getPart1(), truck.getPart2(), truck.getPart3());
    9 }

    实例详细类图

    1.4.总结和应用场景

    • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
    • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
    • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
    • 典型的lombok中的@Builder注解
    • 游戏人物的角色可以使用建造者模式,都有服装,技能,装备等共同属性
    • JDK中的StringBuilder使用了建造者模式
      • 1.Appendable接口定义了append抽象方法,就是一个抽象的建造者
      • 2.AbstractStringBuilder实现了Appendable,就是一个具体的建造者,但是不能实例化
      • 3.StringBuilder继承了AbstractStringBuilder,相当于一个具体建造者角色,同时还是一个指挥者角色

    转载于:http://luokangyuan.com/si-ke-she-ji-mo-shi-jian-zao-zhe-mo-shi/

  • 相关阅读:
    死磕Lambda表达式(四):常用的函数式接口
    死磕Lambda表达式(三):更简洁的Lambda
    死磕Lambda表达式(二):Lambda的使用
    死磕Lambda表达式(一):初识Lambda
    二叉树面试题:前中序求后序、中后序求前序
    五分钟后,你将真正理解MySQL事务隔离级别!
    详细解析Redis中的布隆过滤器及其应用
    详细解析Java虚拟机的栈帧结构
    面试真题:求100万内的质数
    C#-Xamarin的Android项目开发(一)——创建项目
  • 原文地址:https://www.cnblogs.com/it-deepinmind/p/13230363.html
Copyright © 2020-2023  润新知