设计模式学习笔记十:构造器模式

《C++20设计模式》学习笔记——第2章构造器模式 本文是《C++20设计模式——可复用的面向对象设计方法》一书第二章的学习笔记。构造器模式主要关注复杂对象的创建过程。复杂对象指的是难以通过调用单行构造函数来创建的对象。这些类型的对象本身可能由其他对象组成,并且可能涉及不太明显的逻辑,因此需要专门设计单独的组件来创建。 阅读详情

构造器(Builder)模式,也叫生成器模式,属于创建型模式之一。GoF设计模式一书描述此模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。适用场景:创建复杂对象,并且该对象的算法可以独立出来进行复用,构造过程必须允许被构造的对象有不同的表示。

本例子代码基于GoF Builder设计模式场景的Java实现,因为在阅读别人的构造器模式示例代码的时候发现都描述的都不全面,基本都是没有明确的表达出Director的作用。

代码如下:

 

package com.array7.builder;

import java.util.ArrayList;
import java.util.List;

public class Run {
    public static void main(String[] args) {
        TextConverter converter = null;
        RTFReader rtfReader = null;
        List<Integer> tokens = new ArrayList<Integer>();
        tokens.add(RTFReader.CHAR);
        tokens.add(RTFReader.PARA);
        tokens.add(RTFReader.FONT);
        tokens.add(RTFReader.FONT);
        tokens.add(RTFReader.CHAR);

        converter = new ASCIIConverter();
        rtfReader = new RTFReader(converter);
        rtfReader.parseRTF(tokens);
        // product
        String result = converter.getResult();
        System.out.print("======================ASCIIConverter result=====================\n");
        System.out.println(result);

        converter = new TeXConverter();
        rtfReader = new RTFReader(converter);
        rtfReader.parseRTF(tokens);
        result = converter.getResult();
        System.out.print("======================TeXConverter result=====================\n");
        System.out.println(result);

        converter = new TextWidgetConverter();
        rtfReader = new RTFReader(converter);
        rtfReader.parseRTF(tokens);
        result = converter.getResult();
        System.out.print("======================TextWidgetConverter result=====================\n");
        System.out.println(result);
    }
}

/**
 * Director
 */
class RTFReader {
    private TextConverter converter;

    public final static int CHAR = 0;
    public final static int FONT = 1;
    public final static int PARA = 2;

    public RTFReader(TextConverter converter) {
        this.converter = converter;
    }

    public void parseRTF(List<Integer> tokens) {
        // 此处体现了复用,这是在很多Builde代码中没有体现出来的。
        for (Integer token : tokens) {
            switch (token.intValue()) {
                case CHAR :
                    converter.convertCharacter();
                    continue;
                case FONT:
                    converter.convertFontChange();
                    continue;
                case PARA :
                    converter.convertParagraph();
                    continue;
                default:
                    continue;
            }
        }
    }
}

/**
 * Builder
 */
interface TextConverter {
    public void convertCharacter ();
    public void convertFontChange ();
    public void convertParagraph ();
    public String getResult();
}

/**
 * ConcreteBuilder1
 */
class ASCIIConverter implements TextConverter {
    private StringBuffer result = new StringBuffer();
    @Override
    public void convertCharacter() {
        result.append("ASCIIConverter.convertCharacter finished...\n");
    }

    @Override
    public void convertFontChange() {
        result.append("ASCIIConverter.convertFontChange finished...\n");
    }

    @Override
    public void convertParagraph() {
        result.append("ASCIIConverter.convertParagraph finished...\n");
    }

    @Override
    public String getResult() {
        return result.toString();
    }
}

/**
 * ConcreteBuilder2
 */
class TeXConverter implements TextConverter {
    private StringBuffer result = new StringBuffer();
    @Override
    public void convertCharacter() {
        result.append("TeXConverter.convertCharacter finished...\n");
    }

    @Override
    public void convertFontChange() {
        result.append("TeXConverter.convertFontChange finished...\n");
    }

    @Override
    public void convertParagraph() {
        result.append("TeXConverter.convertParagraph finished...\n");
    }

    @Override
    public String getResult() {
        return result.toString();
    }
}

/**
 * ConcreteBuilder3
 */
class TextWidgetConverter implements TextConverter {
    private StringBuffer result = new StringBuffer();
    @Override
    public void convertCharacter() {
        result.append("TextWidgetConverter.convertCharacter finished...\n");
    }

    @Override
    public void convertFontChange() {
        result.append("TextWidgetConverter.convertFontChange finished...\n");
    }

    @Override
    public void convertParagraph() {
        result.append("TextWidgetConverter.convertParagraph finished...\n");
    }

    @Override
    public String getResult() {
        return result.toString();
    }
}

输出结果:

======================ASCIIConverter result=====================
ASCIIConverter.convertCharacter finished...
ASCIIConverter.convertParagraph finished...
ASCIIConverter.convertFontChange finished...
ASCIIConverter.convertFontChange finished...
ASCIIConverter.convertCharacter finished...

======================TeXConverter result=====================
TeXConverter.convertCharacter finished...
TeXConverter.convertParagraph finished...
TeXConverter.convertFontChange finished...
TeXConverter.convertFontChange finished...
TeXConverter.convertCharacter finished...

======================TextWidgetConverter result=====================
TextWidgetConverter.convertCharacter finished...
TextWidgetConverter.convertParagraph finished...
TextWidgetConverter.convertFontChange finished...
TextWidgetConverter.convertFontChange finished...
TextWidgetConverter.convertCharacter finished...


《C++20设计模式》学习笔记——第3章:工厂方法和抽象工厂模式 工厂方法是创建型设计模式的成员之一,它可以一次性完成一个完整对象的创建;与之相比,构造器模式则需要分步提供对象的部分信息才能逐步完成一个对象的创建。工厂方法的关键优势包括:工厂可以拒绝构建对象; 工厂方法可以是多态的;工厂方法的命名不受约束并且可以更有意义;工厂可以实现缓存和其他储存优化;工厂可以将对象不同的关注点内容封装(即关注点分离)。 阅读详情

相关推荐

ADS2020实战:手把手教你搭建交叉耦合VCO并分析相位噪声(附避坑指南)

本文以ADS2020软件为例,提供了交叉耦合压控振荡器(VCO)从原理图搭建到相位噪声分析的完整实战指南。详细讲解了核心器件选择、谐波平衡与瞬态仿真的关键设置,并重点剖析了相位噪声的仿真方法与优化方向。文中附有详细的避坑指南,帮助初学者和工程师高效完成VCO设计与仿真验证,避免常见错误。

p5l2m9n4o6q的博客 283

设计模式——建造者模式(使用director指挥者和不适用director结合代码分析)

【1】什么是建造者模式? 建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。 将一个复杂的构建与其表示(本身)相分离,使得同样的构建过程可以创建不同的表示。现在建造者模式主要用来通过链式调用生成不同的配置。 【2】为什么

zjcoming 1812

DDPG算法实战:用Python一步步实现深度强化学习中的连续动作控制

本文详细介绍了DDPG算法在深度强化学习中的连续动作控制应用,通过Python和PyTorch实现从零构建智能体。内容涵盖环境搭建、网络架构设计、经验回放、OU噪声实现及训练流程优化,帮助开发者掌握DDPG在机械臂控制等场景的核心技术。

weixin_30335575的博客 418

建造者模式(Builder和Director)

一、建造者模式介绍 建造者模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。[构建与表示分离,同构建不同表示] 假如一个对象的构建很复杂,需要很多步骤。则可以使用建造者模式,将其构建对象和组装成一个对象这两步给分开来。构建部分为(builder)和组织部分(director),实现了构建和装配的解耦。 不同的构建器,相同的装配也可以做出不同的对象。 相同的构建器...

weixin_30820151的博客 305

C# HttpClient 实战:3步绕过Cloudflare指纹拦截,获取完整网页内容

本文详细介绍了如何使用C# HttpClient绕过Cloudflare指纹拦截,获取完整网页内容的3步实战方案。通过完美复制浏览器请求头、智能管理Cookie容器以及处理动态挑战页面,开发者可以有效突破Cloudflare的反爬机制,适用于爬虫开发和数据采集项目。

weixin_31856057的博客 323

别再只用GPS了!用Android手机传感器实现室内步行轨迹记录(避坑指南)

本文详细介绍了如何利用Android手机传感器(如加速度计、陀螺仪和磁力计)实现室内步行轨迹记录,克服GPS在室内的局限性。通过传感器数据采集、步态检测、航向估计和轨迹绘制等步骤,结合避坑指南和优化技巧,帮助开发者高效构建室内定位应用。

weixin_26821003的博客 274

构造器模式

构造器模式 代码示例 package test; import java.io.Serializable; /** * 用户对象 * @author test * 1.创建类 * 2.添加当前类的成员变量,区分变量:必须与可选;添加 Set Get 方法 * 3.创建静态内部类 - 当前的建造类 * 4.添加内部类的成员变量,拷贝外部类的成员变量 * 5.添加外部类构造方法,...

走在命运的左岸 871

Tessy集成测试,看完这篇就够了

本文详细介绍了集成测试模块的创建与测试流程。首先,通过TESSY模块进行组件测试管理,设置测试环境并配置相关函数,包括外部函数和组件函数的处理。接着,设计测试用例,包括设置工作任务、增加测试用例、为测试场景添加函数及赋值,并执行测试用例。此外,文章还介绍了集成测试覆盖率的概念,包括CPC(调用对覆盖率)和FC(函数覆盖率)的定义与作用,强调了它们在确保测试充分性和发现潜在问题中的重要性。最后,提到了数据共享的注意事项,指出在测试过程中全局变量的共享特性及桩函数调用的处理方式。

qq_37282365的博客 1098

【学习笔记】设计模式-构造器模式(Builder)

文章目录0 设计模式1 构造器模式2 实现思路2.1 Java中典型的Builder模式2.2 复杂构造者模式3 需要的类3.1 Java典型的Builder模式需要的类3.2 复杂构造者模式需要的类4 具体实现4.1 Java典型的Builder模式具体实现4.1.1 Person(需要构造的类,构造器放在其内部,用静态内部类表示)4.1.2 Location(Person中以用的类)4.1.3 测试类4.2 复杂构造者模式具体实现4.2.1 TerrainBuilder(构造器接口)4.2.2 Terr

五条的博客 5291

在Tricore上移植μC/OS-III——1.1 AURIX Development Studio的使用

本文主要介绍AURIX Development Studio软件的安装和使用方法。 英飞凌针对Tricore系列单片机推出了一款免费的软件——AURIX™ Development Studio,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 可从下面的链接获取软件安装包,软件安装好后,新建工程时会自

weixin_42967006的博客 2291

语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python)

本文介绍了Python中常用的音频处理库PyAudio,详细解析了其核心功能、核心概念和典型工作流程。PyAudio是一个跨平台的音频I/O库,支持音频录制、播放、实时流处理和低延迟操作。核心概念包括PyAudio类(管理音频设备和流)和Stream类(代表音频流)。文章重点讲解了open()方法的关键参数、回调函数的使用方式以及典型的工作流程,包括设备查询、流配置和资源释放。PyAudio适用于需要实时音频处理的场景,如语音识别和音频效果处理。

算法工程师 706

《C++20设计模式》学习笔记--构造器模式

构造器模式的目的是简化复杂对象或一系列对象的构建过程,从而单独定义构成该复杂对象的各个组件的构建方法。构造器模式可以通过流式接口调用链来实现复杂的构建过程。为了实现流式接口,构造器函数需要返回this或 *this。为了强制用户使用构造器的API,我们可以将目标对象的构造函数限制为不可访问,同时,定义一个create()接口返回构造器。通过定义适当的运算符,可以使构造器转化为对象本身。借助C++新特性中的统一初始化语法,可以实现Groovy风格的构造器。

BirdsLife的博客 1816

H3LIS200DL三轴加速度传感器原理图设计,已量产(加速度传感器)

在最近的工业振动监测项目里,我们选了 ST 的 H3LIS200DL 做核心传感器 —— 这颗料的特点太契合场景了:±100g/200g 的大量程刚好覆盖设备冲击与振动的测量需求,10μA 的超低功耗能适配电池供电的边缘节点,0.5Hz 到 1kHz 的输出速率也足够抓准动态信号。下面结合实际画的原理图,拆解下这个硬件电路的设计思路。

不脱发的程序猿 340

设计模式学习笔记

保证某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。通过一个工厂类来集中管理对象的创建逻辑,客户端无需直接实例化具体类,实现对象创建与使用的解耦。简单工厂模式是工厂模式的一种。定义了一个创建对象的抽象方法,由子类决定要实例化的类。将对象的实例化推迟到子类。每个子类都可以实现工厂接口以提供具体的对象实例化过程提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式允许客户端在不指定具体类的情况下,创建一系列的产品对象。

陈暗暗的博客 1149

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

javascript从入门到跑路-----小文的js学习笔记(27)-----对象模式----工厂模式、构造函数模式、原型模式、组合使用构造器和原型模式以及 动态原型模式

** javascript从入门到跑路-----小文的js学习笔记(1)---------script、alert、document。write() 和 console.log 标签 javascript从入门到跑路-----小文的js学习笔记(2)--------- 语法构成、关键字和保留字、变量 javascript从入门到跑路-----小文的js学习笔记(3)---------javascript中的几种数据类型 … … javascript从入门到跑路-----小文的js学习笔记目录 ** &nb

qq_45948983的博客 3915

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

简单过过Javascript设计模式(上)

前言 设计模式可不是几篇文章能够说明白的,这篇文章也是我的学习笔记吧。 构造器模式 最简单的设计模式,其实就是我们常见的: function User(name, age) { this.name = name; this.age = age } let a = new User('asen', 12) 在使用构造器模式的时候,我们本质上是去抽象了每个对象实例的变与不变,对于上面代码,不...

eswang的优快云博客 299

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《图解设计模式》学习笔记

《图解设计模式》与《大话设计模式》笔记

toutu10086的博客 245

《设计模式》学习笔记

定义一个 “对象创建器类” (AbsractFactoryClass),每当我们想要创建一个对象,就先找到一个 AbsractFactoryClass 子类的实例,再调用他的成员函数来实现创建对象的功能。当我们需要整体改变程序中的“风格时”,对 AbsractFactoryClass 进行派生。简而言之,抽象工厂就是对某些类的实例化进行抽象。当我们想要在一个函数中实例化某个对象时,我们可以对这个函数传入一个 Absract Factory 类的引用以指导我们实例化哪个类。

总理同学的编程尝试 1217

《C++20设计模式》学习笔记代码---构造器模式

【代码】《C++20设计模式》学习笔记代码---构造器模式。

BirdsLife的博客 672

JAVA学习笔记- - - day 2

目录💕前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望能和大家一起进步成长💕封装(重点)数组一维数组(重点)二维数组方法的重载(重点)this关键字(重点)构造器(重点)默认构造器有参构造器static关键字(重点)属性上(静态属性/变量)方法上(静态方法)静态代码块设计模式(重点)单例。

m0_71956038的博客 5万+

设计模式学习笔记 - 单例设计模式

设计模式(Design pattern)是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式并不局限于某种语言,java、php、c++都有设计模式。设计模式的本质提高软件的维护性,通用性和扩展性,并降低软件的复杂度。

qq_42141141的博客 1012

Netty学习笔记九:netty源码分析和设计模式

1. Netty学习笔记九:netty源码分析和设计模式 文章目录1. Netty学习笔记九:netty源码分析和设计模式1.1. Netty核心模块缓冲ByteBuf1.2. ByteBuf的创建方法1.3. ByteBuf使用模式2. Netty里面的设计模式应用分析2.1. Builder构造器模式2.2. 责任链设计模式2.3. 工厂设计模式2.4. 适配器模式2.5. 设计模式推荐书籍 ...

公子&小白的博客 746

尚硅谷学习笔记——Java设计模式(一)设计模式七大原则

什么是设计模式?设计模式常用的七大原则是什么?

five小点心的博客 1693
上一篇: 设计模式学习笔记九:原型模式(和深浅复制)
下一篇: 记一次死锁问题的处理
七郎
博客等级 码龄14年 31粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值