[DP]Builder设计模式

NXP MCU CAN波特率(位时间)配置详解 1. 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。 波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。 我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些: ... 阅读详情

上一章节,我们终于在全国各地开满了我们的KFG餐厅连锁店,这一次我们要深入餐厅内部了。

我们将要了解顾客是如何点餐的。


按照正常情况来说,顾客来到店里,然后找到服务员,然后就开始点餐。

然后再点完餐后,服务员联系后厨按照订单完成客人所点的食物。然后所有点餐完成之后,将产品给我们的顾客。


我们理一理思路:

1.Waiter 等到顾客到店。

Waiter w = new Waiter();

2.然后Customer到店了。

Customer c = new Customer();
3.然后Customer找Waiter点餐。

嗯,我要一份炸鸡,还要一份薯条,嗯一份汉堡,我太饿了,再来一份汉堡

w.order(FoodType.Chicken).order(FoodType.Chip).order(FoodType.HAMBURGER).order(FoodType.HAMBURGER);
4.服务员从配餐员Pantryman得到所有的食物。

List<Food> foods = w.getFoods();
5.最后也是最重要的一步,那就是我们的Customer将食物全部给吃光了。

c.eatFoods(foods);

纵观上述过程,发现并没有特殊的地方,除了第3步 点餐这个地方,好像有点意思。


第3步可以大概理解为 按照客户的要求构建产品。该产品十分复杂,一份炸鸡,一份薯条,再加上两个汉堡。

那么假如我要两份炸鸡,一份薯条,三个汉堡,该怎么办?

w.order(FoodType.Chicken).order(FoodType.Chicken).order(FoodType.Chicken).order(FoodType.Chip).order(FoodType.HAMBURGER).order(FoodType.HAMBURGER).order(FoodType.HAMBURGER);
看吧并没有什么难的。只要不断的下订单,不管多少复杂的订单我都照但全收了。


实际上这里隐藏了Builder设计模式,


问题:在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定。


解决方案:

建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


适用性:
在以下情况使用Builder模式
•当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
•当构造过程必须允许被构造的对象有不同的表示时。


结 构:


GoF图


• 抽象建造者角色(Builder):为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
• 具体建造者(ConcreteBuilder)
1)实现Builder的接口以构造和装配该产品的各个部件。即实现抽象建造者角色Builder的方法。
2)定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建
3)  提供一个检索产品的接口
4)   构造一个使用Builder接口的对象即在指导者的调用下创建产品实例
指导者(Director):调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。
产品角色(Product):建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。


在我们上个例子中:

抽象建造者 ———— Cook 提供接口

public void cook(FoodType type);

然后我们具体建造者 ———— Pantryman 根据订单要求构建产品。

同时提供一个方法,将构建的产品交给服务员Waiter。

public List<Food> getFoods()

而指导者 ———— Waiter 则指导用户如何订餐,然后将订单给我们的配餐员Pantryman

public Waiter order(FoodType type) 
这里的产品角色 ———— 其实就是我们按照客户需求所做的各种食物。

private List<Food> foods = new LinkedList<Food>();



不废话了,这里直接贴上所有代码。

enum FoodType {
	CHIP, HAMBURGER, CHICKEN
}

abstract class Food {
	abstract public String getName();
}

class Chip extends Food {
	private String name = "Chip";

	public Chip(String name) {
		this.name = name;
	}

	@Override
	public String getName() {
		return name;
	}
}

class Hamburger extends Food {
	private String name = "Hamburger";

	public Hamburger(String name) {
		this.name = name;
	}

	@Override
	public String getName() {
		return name;
	}
}

class Chicken extends Food {
	private String name = "Chicken";

	public Chicken(String name) {
		this.name = name;
	}

	@Override
	public String getName() {
		return name;
	}
}

interface KGFFoodLine {
	public Food cookChip();

	public Food cookHamberger();

	public Food cookChicken();
}

class BeijingFoodLine implements KGFFoodLine {

	@Override
	public Food cookChip() {
		return new Chip("Beijing Chip");
	}

	@Override
	public Food cookHamberger() {
		return new Hamburger("Beijing Hamberger");
	}

	@Override
	public Food cookChicken() {
		return new Chicken("Beijing Chicken");
	}
}

class Customer {
	private static String[] remarks = { "taste not so bad, i like it.", "damn bad, it smells like expired.",
			"yummy,yummy." };

	public FoodType makeOrder() {
		FoodType[] types = FoodType.values();
		int type = (int) (Math.random() * 100) % types.length;
		return types[type];
	}

	public void eatFoods(List<Food> foods) {
		for (Food food : foods) {
			String remark = remarks[(int) (Math.random() * 100) % remarks.length];
			System.out.println(food.getName() + "," + remark);
		}
	}
}

好的,这里我就要考考你们上一篇设计模式是否有所领悟,这是什么设计模式呢?



Bingo,没错 就是抽象工厂方法设计模式,回忆一下,什么是抽象工厂方法设计模式呢?

就是生产一系列产品族的工厂设计模式。

咱们这里是具体视察的BeijingKFG分店。

这里综合运用上篇的抽象工厂方法设计模式来产生各种食物。


这里是本篇中新加的部分

interface Cook {
	public void cook(FoodType type);
}

class Pantryman implements Cook {
	private List<Food> foods = new LinkedList<Food>();
	private KGFFoodLine foodLine = new BeijingFoodLine();

	@Override
	public void cook(FoodType type) {
		switch (type) {
		case CHIP:
			foods.add(foodLine.cookChip());
			break;
		case HAMBURGER:
			foods.add(foodLine.cookHamberger());
			break;
		case CHICKEN:
			foods.add(foodLine.cookChicken());
			break;
		default:
			break;
		}
	}

	public List<Food> getFoods() {
		List<Food> orders = foods;
		foods = new LinkedList<Food>();
		return orders;
	}

}

class Waiter {
	private Pantryman chef = new Pantryman();

	public Waiter order(FoodType type) {
		chef.cook(type);
		return this;
	}

	public List<Food> getFoods() {
		return chef.getFoods();
	}
}

public class Builder {
	public static void main(String[] args) {
		Waiter w = new Waiter();
		Customer c = new Customer();
		w.order(FoodType.CHICKEN).order(FoodType.CHIP).order(FoodType.HAMBURGER).order(FoodType.HAMBURGER);
		List<Food> foods = w.getFoods();
		c.eatFoods(foods);
	}
}


好了,作为本篇的末尾,

我们需要总结一下使用该种设计带来的好处。

1 ) 它使你可以改变一个产品的内部表示 Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。————  比如说所有食品的组合,这个地方用LinkedList 其实很容易猜测出来,那么如果下次咱们换到装配一辆汽车呢,谁关心汽车是怎么装配的呢? 我要一个空调,那么就给我装一个空调就好了。

2) 它将构造代码和表示代码分开 Builder模式通过封装一个复杂对象的创建和表示方式提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类是不出现在Builder接口中的。每个Concrete Builder包含了创建和装配一个特定产品的所有代码。这些代码只需要写一次;然后不同的Director可以复用它以在相同部件集合的基础上构作不同的Product。———— 这里我们的w 之后再接待多少个客人 都能返回客人所订餐的所有食物,无论订单产生了何种变化,都能准确的完成服务。

3 ) 它使你可对构造过程进行更精细的控制 Builder模式与一下子就生成产品的创建型模式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器中取回它。因此Builder接口相比其他创建型模式能更好的反映产品的构造过程。这使你可以更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。———— 我们一步一步的根据的客人的意图完成订单的完成。


最后实在抱歉,个人能力不够没有在spring中找到buidler设计模式的代码。


【WRF-Chem教程-附录B】使用 MOZART 与WRF-Chem 使用MOZART与WRF-Chem 阅读详情

相关推荐

使用STM32制作简易数字时钟

连接LED数码管的电源和地线到STM32单片机的对应引脚,将数码管的A、B、C、D引脚连接到STM32单片机的I/O口引脚。通过编写和调试这个项目,可以熟悉STM32单片机的GPIO口和定时器的使用,以及数字显示的控制。步骤六:测试和调试 通过观察数码管的显示,可以验证时钟功能是否正常工作。步骤四:编写代码 在主程序中,我们将使用定时器中断来控制时钟的运行,并使用GPIO口控制LED数码管的显示。步骤五:编译和下载 编译代码并下载到STM32单片机中,通过调试器和串口监视器进行调试和查看输出结果。

qq_67153941的博客 1302

变种 Builder 模式:优雅的对象构建方式

读完本文你将了解到: 帅气的 Builder 链式调用 常见的两种构建方式 常见的构建方式之一定义多个重载的构造函数 常见的构建方式之二使用 setter 方法挨个构造 优雅的构建方式变种 Builder 模式 Android Studio 中使用插件自动生成 变种 Builder 模式代码 总结帅气的 Builder 链式调用在日常开发中,经常可以看到这样的代码:Retrofit retrofit

张拭心的博客 shixinzhang 1万+

保姆级教程:在iQuant平台从零写一个Python量化策略(附完整代码示例)

本文提供了一份详细的iQuant平台Python量化策略开发教程,从环境准备到策略实现、回测优化,再到实盘运行,每个步骤都配有完整代码示例和常见问题解决方案。适合量化交易新手快速上手,掌握双均线策略等核心开发技巧。

weixin_42783709的博客 479

java中用builder模式实现实体类的创建

package com.panther.builder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式, * 所构建的对象往往需要多步初始化或赋值才能完成。 * 那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢? * 其中

panther的专栏 9071

ubuntu20.04安装Qt5.15.2并配置环境

qt官方取消了离线安装的方式,所以推荐在线安装,当然,如果想要自己通过源码编译也可以,参考官方文档:https://wiki.qt.io/Building_Qt_5_from_Git。 在线安装: 1.到官方网站下载:wget https://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run 2.修改文件权限:chmod 777 qt-unified-linux-x64-online.run

f120854632的博客 8807

MySQL——cost成本计算之MySQL如何选择使用索引(trace)

文章目录前言trace工具分析执行计划 前言 在之前博客中,根据测试案例,发现同样的sql语句,因为传入的条件值的不同,导致MySQL有时候选择使用索引,有时候又不适用索引。 如下所示sql的执行计划: EXPLAIN SELECT * FROM employees WHERE name > 'aaa'; EXPLAIN SELECT * FROM employees WHERE name > 'zzzz'; 在MySQL中,为什么会出现上述这种玄乎的现象呢? 本篇博客重点说明原因。 在说

专注写bug 679

设计模式——Builder模式

设计模式:Builder模式 一、前言 今天我们讨论一下Builder建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在Builder模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是‘监工’,规定了到底要怎么样有机的组合这些方法。在监工类...

早起吃虫的博客 1306

Langchain cannot connect with Azure SQL Database

Langchain 无法连接到 Azure SQL 数据库

suiusoar 633

android开发中Builder设计模式应用之——AlterDialog源码分析及其实现方式

1,在开始分析AlterDialog之前我们先来写一个小Dmeo学习一下Builder设计模式的最简单的使用方法: Builder设计模式的定义:将一个复杂对象的构建与它的表示分离,使得不同的构建过程可以创建不同的显示,但其根本还是不变。 Product 产品类 : 产品的抽象类; Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程; ConcreteBuil...

yaoyaoyao_123的博客 399

【python爬虫--爬取电商商品及对其销量、好差评等数据进行分析】Python爬虫爬取电商商品及大数据分析-实战

选择目标电商网站:这里选择爬取两个不同电商网站(比如京东、淘宝)上的商品数据,包括商品名称、价格、销量和评价信息。编写爬虫:通过爬虫获取商品信息并保存数据。数据清洗与对齐:将两个电商网站抓取到的数据进行统一清洗和对齐。数据分析:进行销量分析、好评与差评分析等。

Dreams°的博客 4011

从零搭建 C# + YOLO 工业视觉系统:从模型训练到上位机部署(工业级落地)

做工业质检、自动化生产线的同学都懂:一套能用的工业视觉系统,既要“检测准”,又要“界面易操作”,还要“部署稳”。之前帮某电子厂做PCB缺陷检测,一开始用Python+YOLO做检测核心,QT做上位机,结果踩了无数坑:Python推理速度波动大,QT和Python跨语言集成繁琐,数据传递容易卡顿;后来换成C# + YOLO的组合,直接打通了“模型训练-上位机开发-工业部署”全流程——C#的WinForms/WPF开发上位机高效,工业相机SDK支持完善;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 737

23种设计模式-Builder模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Product 产品类 : 产品的抽象类。Builder : 抽象类, 规范产品的组建,一般是由子类实现具体的组件过程。ConcreteBuilder : 具体的构建器.Director : 统一组装过程(可省略)。电脑的组装过程较为复杂,步骤繁多,但是顺序却是不固定的。下面我们以组装电脑为例来演示一下简单且经典的builder模式。

陈立的博客 737

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

funfan的博客 5196

Builder设计模式 - 构建整个应用的万能Dialog

1. 概述  上一期的热修复相对来说有点难度,我其实也没往深里说如果实在看不懂可以看看视频,其实最主要的还是思路代码也就那么几行,这一期我们又回归到设计模式,相对来说要简单不少,这一期要讲的是一行代码如何显示所有弹出框效果。  视频地址:http://pan.baidu.com/s/1gfwZfF1  相关文章:  2017Android进阶之路与你同行  Builder设计模式 - 构建整个项目的

z240336124的专栏 693

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

设计模式之Builder

设计模式之Builder原文:http://www.vincehuston.org/dp/builder.html定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.也就是说将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制

绿色空间---飞鹰的专栏 385

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

简单模拟Android中AlertDialog的Builder设计模式

简单模拟Android中AlertDialog的Builder设计模式

qq_43661309的博客 247

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android设计模式源码解析之Builder模式

本文为 Android 设计模式源码解析 中 Builder模式 分析 Android系统版本: 2.3 分析者:Mr.Simple,分析状态:完成,校对者:Mr.Simple,校对状态:完成原文地址:1. 模式介绍模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。模式的使用场景相同的方法,不同的执行顺序,产生不同的事件结果时; 多个部件或零件,都可以装配到一

chenchuanwen111的博客 555

Builder设计模式 构建整个应用的万能Dialog

###1. 概述 上一期的热修复相对来说有点难度,我其实也没往深里说如果实在看不懂可以看看视频,其实最主要的还是思路代码也就那么几行,这一期我们又回归到设计模式,相对来说要简单不少,这一期要讲的是一行代码如何显示所有弹出框效果。 视频地址:http://pan.baidu.com/s/1gfwZfF1 相关文章: 2017Android进阶之路与你同行 Builder设计模式 - 构建整个项目的...

weixin_34348111的博客 127

简单分下Builder 模式

介绍 Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程,该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和创建过程隔离开来。 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时。 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。 简单代码示例 这里比如我们第一次初始化应用的时候,需要初始化一些事物,

1 240

对Builder 模式的简单分析

介绍 Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程,该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和创建过程隔离开来。 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时。 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。 简单代码示例 这里比如我们第一次初始化应用的时候,需要初始化一些事物,

1 283

builder设计模式

本文转自:http://blog.youkuaiyun.com/bboyfeiyu/article/details/15504187    在Android中经常要使用AlertDialog来显示一些简单的窗口,通常的写法类似下面的代码 :  [java] view plain copy AlertDialog dialog = new Alert

gaitiangai的专栏 225

设计模式:Builder模式

设计模式:Builder模式 一、前言 今天我们讨论一下Builder建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在Builder模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是‘监工’,规定了到底要怎么样有机的组合这些方法。在监工类...

weixin_30501857的博客 170

Android中Builder设计模式

模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景 1、相同的方法,不同的执行顺序,产生不同的事件结果时; 2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时; 3、产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适; UML类图 角色介

u010698836的专栏 536
上一篇: [DP]简单工厂,工厂方法和抽象工厂方法
下一篇: [DP]Prototype设计模式
HeapStackk
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值