热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

建造者模式(创建型)

建造者模式(创建型)-建造者模式介绍建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造出一个复杂的对象。可以将建造者模式理解为,假设我们有一个对象需要建立,这个对

建造者模式

介绍

建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造出一个复杂的对象

可以将建造者模式理解为,假设我们有一个对象需要建立,这个对象是由多个组件(Component)组合而成,每个组件的建立都比较复杂,但运用组件来建立所需的组件对象非常简单,所以我们就可以将构建复杂组件的步骤与运用组件构建对象分离,从而构造出复杂的对象。

建造者模式包含如下角色:

  • 抽象建造者类(Builder):这是一个接口,该接口除了为创建一个Product对象的各个组件定义了若干个方法之外,还要定义返回Product对象的方法(定义构造步骤);
  • 具体建造者类(ConcreteBuilder):实现 Builder 接口的类,实现Builder接口中所定义的方法(生产各个组件);
  • 产品类(Product):要创建的复杂对象;
  • 指挥者类(Director):指挥者是一个类,该类需要含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体生成器,即指挥者将请求具体生成器类来构造用户所需要的Product对象,如果所请求的具体生成器成功地构造出Product对象,指挥者就可以让该具体生产器返回所构造的Product对象。(按照步骤组装部件,并返回Product)

举个?:

构造一台电脑,需要经过以下步骤:生产主机、生产显示器、生产键盘、生产鼠标。虽然不同的电脑需要的主机、显示器和键鼠型号不同,但不管怎样,它总是需要按照以上步骤来构建。对于这个例子,我们就可以使用生成器模式来生成一台电脑,他需要通过多个步骤来生成。代码如下。

产品类:

public class Computer {
    private String keyboard;
    private String mouse;
    private String screen;
    private String Master;
    
    // 省略getter setter toString
}

抽象建造者类:(生产电脑的抽象类)

public abstract class ComputerBuilder {

    protected Computer computer = new Computer();

    public abstract void buildKeyboard();
    public abstract void buildMouse();
    public abstract void buildScreen();
    public abstract void buildMaster();

    public abstract Computer createComputer();
}

具体建造者类:(如惠普、戴尔)

public class HPComputerBuilder extends ComputerBuilder{
    @Override
    public void buildKeyboard() {
        computer.setKeyboard("cherry 青轴机械键盘");
    }

    @Override
    public void buildMouse() {
        computer.setMouse("雷蛇竞技鼠标");
    }

    @Override
    public void buildScreen() {
        computer.setScreen("1920*1080 AOE 28寸曲面屏");
    }

    @Override
    public void buildMaster() {
        computer.setMaster("(i7,16g,512SSD,1060)的惠普主机");
    }

    @Override
    public Computer createComputer() {
        return computer;
    }
}

public class DellComputerBuilder extends ComputerBuilder{
    @Override
    public void buildKeyboard() {
        computer.setKeyboard("dell 青轴机械键盘");
    }

    @Override
    public void buildMouse() {
        computer.setMouse("dell 官方竞技鼠标");
    }

    @Override
    public void buildScreen() {
        computer.setScreen("1920*1080 dell 28寸曲面屏");
    }

    @Override
    public void buildMaster() {
        computer.setMaster("(i7,16g,1T SSD,1060)的戴尔主机");
    }

    @Override
    public Computer createComputer() {
        return computer;
    }
}

指挥者类:(对组件进行组装并生成产品)

public class Director {
    private ComputerBuilder computerBuilder;

    public Director(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }

    public Computer constructComputer() {
        computerBuilder.buildMaster();
        computerBuilder.buildMouse();
        computerBuilder.buildScreen();
        computerBuilder.buildKeyboard();

        return computerBuilder.createComputer();
    }
}

指挥者类 Director 在建造者模式中具有很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类。

测试类:

public class Client {
    public static void main(String[] args) {
        // 构造一台戴尔电脑
        showComputer(new DellComputerBuilder());
        // 构造一台惠普电脑
        showComputer(new HPComputerBuilder());
    }

    private static void showComputer(ComputerBuilder builder) {
        Director director = new Director(builder);
        Computer computer = director.constructComputer();

        System.out.println(computer);
    }
}

优缺点

优点:

  • 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;
  • 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程;
  • 建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类(如再构造一台华硕电脑)就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。符合开闭原则。

缺点:

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大(如电脑和手机),则不适合使用建造者模式,因此其使用范围受到一定的限制。

使用场景

创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。

创建型模式对比

工厂方法模式注重的是整体对象的创建方式;而建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。举个例子,如果要创建一台手机,直接产生一个CPU为天玑9000、运行内存为8G、容量为256G、屏幕材质为LCD的智能手机;而如果使用建造者模式,则需要组装CPU、内存、屏幕等部分。

抽象工厂模式实现对产品族的创建,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。

参考

(140条消息) 23 种设计模式详解(全23种)_鬼灭之刃的博客-CSDN博客_设计模式

https://www.bilibili.com/video/BV1Np4y1z7BU


推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
author-avatar
王佳秋承男
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有