建造者

创建类模式大PK

时光总嘲笑我的痴心妄想 提交于 2019-12-05 14:50:02
创建类模式包括工厂方法模式、 建造者模式、 抽象工厂模式、 单例模式和原型模式, 它们都能够提供对象的创建和管理职责。 其中的单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象, 原型模式是要求通过复制的方式产生一个新的对象, 这两个不容易混淆。 剩下的就是工厂方法模式、 抽象工厂模式和建造者模式了, 这三个之间有较多的相似性。30.1 工厂方法模式VS建造者模式工厂方法模式注重的是整体对象的创建方法, 而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象。 我们举个简单例子来说明两者的差异, 如要制造一个超人, 如果使用工厂方法模式, 直接产生出来的就是一个力大无穷、 能够飞翔、 内裤外穿的超人; 而如果使用建造者模式, 则需要组装手、 头、 脚、 躯干等部分, 然后再把内裤外穿, 于是一个超人就诞生了。 纯粹使用文字来描述比较枯燥, 我们还是通过程序来更加清晰地认识两者的差别。30.1.1 按工厂方法建造超人首先, 按照工厂方法模式创建出一个超人, 类图如图30-1所示。图30-1 按工厂方法建造超人类图中我们按照年龄段把超人分为两种类型: 成年超人(如克拉克、 超能先生) 和未成年超人(如Dash、 Jack) 。 这是一个非常正宗的工厂方法模式, 定义一个产品的接口, 然后再定义两个实现, 通过超人制造工厂制造超人。

十一、建造者模式

巧了我就是萌 提交于 2019-12-05 14:48:57
建造者模式 模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。 该模式的主要优点如下: 各个具体的建造者相互独立,有利于系统的扩展。 客户端不必知道产品内部组成的细节,便于控制细节风险。 其缺点如下: 产品的组成部分必须相同,这限制了其使用范围。 如果产品的内部变化复杂,该模式会增加很多的建造者类。 建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。 模式的结构与实现 建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。 1. 模式的结构 建造者(Builder)模式的主要角色如下。 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。 具体建造者(Concrete Builder):实现 Builder

建造者模式

心不动则不痛 提交于 2019-12-05 14:40:45
建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。 主要解决: 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 例子 MealBuilder类相当于一个点餐平台,Meal类则用来统计各种分类的总价格,Item就是其中某一道食物,可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡又分为素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),放在纸盒中(Wrapper),冷饮又分为可口可乐(coke)或百事可乐(pepsi),放在瓶子中(Bottle)。 1、Item某样食物 1 public interface Item { 2 String name(); 3 Packing packing(); 4 float price(); 5 } Item 2、包装类 1 //包装类 2 public interface Packing { 3 String pack(); 4 } Packing 3、汉堡和冷饮(食物的两大类别) 1

《设计模式之禅》之建造者模式

别等时光非礼了梦想. 提交于 2019-12-05 11:32:35
一、建造者模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二、建造者模式的应用 1.建造者模式的优点 (1)封装性 使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。 (2)建造者独立,容易扩展 BenzBuilder和BMWBuidler是相互独立的,对系统的扩展非常有利。 (3)便于控制细节风险 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。 2.建造者模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式; 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式; 产品类非常复杂,或者产品类中的调用顺序不同产生不同的效能,这个时候使用建造者模式非常合适; 在对象创建过程中会使用系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。这种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计的最初目标; 3.建造者模式的注意事项 建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式

设计模式之建造者模式、模版方法

ぃ、小莉子 提交于 2019-12-05 00:09:52
一、建造者模式 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。 建造者模式通常包括下面几个角色: 1、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。 2、ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。 3、Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。 4、Product:要创建的复杂对象。 1、建造者应用场景 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 19元每周三 汉堡+可乐+薯条=套餐可能会发生改变。 2、JAVA 中的 StringBuilder 数组(单个字符)字整合在一起 字符串 使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。 与工厂模式的区别是

设计模式——创建型模式之建造者模式(五)

烈酒焚心 提交于 2019-12-04 07:14:55
模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的 设计模式 被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。 该模式的主要优点如下: 各个具体的建造者相互独立,有利于系统的扩展。 客户端不必知道产品内部组成的细节,便于控制细节风险。 其缺点如下: 产品的组成部分必须相同,这限制了其使用范围。 如果产品的内部变化复杂,该模式会增加很多的建造者类。 建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而 工厂方法模式 更注重零部件的创建过程,但两者可以结合使用。 模式的结构与实现 建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。 1. 模式的结构 建造者(Builder)模式的主要角色如下。 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。 具体建造者(Concrete Builder):实现 Builder

初学设计模式之建造者模式

99封情书 提交于 2019-12-03 06:35:49
1、建造者模式的基本概念 建造者模式的最初定义是:将一个复杂对象的创建与它的表示分离,使得同样的创建过程可以创建不同的表示。 我们一起来理解一下这句话,首先第一词语是复杂对象,什么是复杂对象,就是这个对象的生成过程不是new int这样一下就行了,是在对象的生成过程中间去配置对象的属性,所谓属性就是成员变量,之所以说复杂是因为可能有很多成员变量需要赋值。或者是成员变量不多,但是成员变量本身是一个“”复杂“对象”,内部有很多成员变量需要赋值。下一个词语是“表示”,所谓表示指的就是展现给别人看时的样子,也就是其展现出来的功能。这句话用自己的理解来讲述的话就是:一个对象内部带有的属性有很多需要配置的地方,就称之为复杂对象。复杂对象的配置方法和执行这些方法的行为是分开实现的,这样的对象在生成过程中就可以灵活的给予不同配置,根据其其配置的不同,展现出来的功能也是不一样的。同一套配置方法,由于配置方法的执行个数、执行内容和执行顺序不同,装配出来的对象实现功能也不同。 2、代码案例与分析 考虑这样的一个场景:一个产品,内部有一个零件装配清单;通过不同方式的装配能够呈现出不同的产品,代码的实现过程如下: 1 //建造者模式 2 #include <iostream> 3 #include"string" 4 #include"list" 5 using namespace std; 6 7 /

建造者模式的理解

我们两清 提交于 2019-12-02 11:40:10
参照的一篇简书文章,链接如下: 一篇文章就彻底弄懂建造者模式(Builder Pattern) 简单说说我对建造者模式的理解吧, 我们去KFC点餐,一个food和一杯饮料的套餐,套餐一:可乐+鸡翅;套餐2:雪碧+薯条 当然KFC的针对套餐分配了服务员,你去前台点餐的时候,只需要说老板,我要套餐某某就可以了,其他的事情嘛,套餐某某的服务员会给你办理的妥妥的。 现在梳理一下对应的角色: 服务员:writer = director 负责监督套餐的完成进度 后厨代表:Builder 负责叫一个人去完成套餐 墩子:subBuilder 真正做菜的人 这样的话套餐类需要给出,包括了哪些菜品: class Meal{ private String food; private String drink; public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getDrink() { return drink; } public void setDrink(String drink) { this.drink = drink; } } 后厨代表需要牢记这个菜品,并且按按照套餐要求进行做菜 abstract class Builder{

设计模式:建造者模式

◇◆丶佛笑我妖孽 提交于 2019-11-29 23:35:40
无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述, 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。 建造者模式(Builder Pattern) 又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 建造者模式的优点 1、客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。 2、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象 。 3、可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。 4、增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合 “开闭原则”。 什么情况不要用建造者模式 1

设计模式之建造者模式

半城伤御伤魂 提交于 2019-11-29 22:30:14
建造者模式主要在于创建一些复杂的对象。将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式;class Product { private $_parts; public function __construct() { $this->_parts = array(); } public function add($part) { return array_push($this->_parts, $part); }}/** * 建造者抽象类 */abstract class Builder{ public abstract function buildPart1(); public abstract function buildPart2(); public abstract function getResult();}/** * 具体建造者 * 实现其具体方法 */class ConcreteBuilder extends Builder { private $_product; public function __construct() { $this->_product = new Product(); } public function buildPart1(){ $this->_product->add('Part1'); } public