建造者

设计模式-创建型-建造者模式

╄→гoц情女王★ 提交于 2019-11-29 20:52:13
引言:   无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、底盘、发动机、方向盘等各种部件。而对于大部分用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车。有的人说: 抽象工厂模式 不是用来生产产品的吗,我们使用它来解决不是可以了吗?貌似有一定的道理,但是你有没有考虑到了安装细节,每辆汽车的零部件安装细节可能是不同的。 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。那怎么办呢?于是,建造者模式应运而生。 建造者模式:   建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。   建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构造细节。 建造者模式有四个角色:   1、Product(产品):一个具体的产品对象。(也可以使用抽象工厂模式来进行细分)   2、Builder(抽象建造者):创建一个Product对象的各个部件指定的接口。   3、ConcreteBuilder(具体建造者):实现接口

建造者模式Builder Pattern

纵饮孤独 提交于 2019-11-29 08:17:06
## 模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。 该模式的主要优点如下: 各个具体的建造者相互独立,有利于系统的扩展。 客户端不必知道产品内部组成的细节,便于控制细节风险。 其缺点如下: 产品的组成部分必须相同,这限制了其使用范围。 如果产品的内部变化复杂,该模式会增加很多的建造者类。 建造者(Builder)模式和工厂模式的关注点不同: 建造者模式注重零部件的 组装过程 ,而工厂方法模式更注重零部件的 创建过程 ,但两者可以结合使用。 何时使用:一些基本部件不会变,而其组合经常变化的时候。 如何解决:将变与不变分离开。 关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。 来源: https://blog.csdn.net/zjcjava/article/details/100668785

Builder建造者模式

人走茶凉 提交于 2019-11-29 06:33:18
目标:将一个复杂对象的构建与表示分离,使同样的构建过程可以创建不同的表示。 使用场景:典型的KFC儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。 优点: 使用建造者模式可以使客户端不必知道产品内部组成的细节。 具体的建造者类之间是相互独立的,对系统的扩展非常有利。 由于具体的建造过程的独立的,因此可以对建造过程逐步细化,而不对其他模块产生影响。 实现: Builder:抽象建造者。他声明为创建一个Product对象的各个部件指定的抽象接口。 ConcreateBuilder:具体建造者。实现抽象接口,构建和装配各个部件。 Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。 Product:产品角色。一个具体的产品对象。 public class BuilderTest { /*** * 抽象的建造者只关心对象有哪些步骤, * 具体的建造者只关心如何实现每一个具体的步骤, * 指挥者只关心构建的顺序, * 三方各司其职,很好的隔离了构建对象的步骤和顺序, * 一但指挥者和建造者确定了,开发者只需要关心如何实现和更新具体步骤就行了, */ public

建造者模式—通俗易懂解析设计模式

人盡茶涼 提交于 2019-11-28 19:18:58
前言   在本篇文章中,我们重点介绍建造者模式 ( Builder Pattern ), 建造者模式顾名思义,与建造创建相关。事实也是如此建造者模式也是创建型中的一种。在我们平常生活中会有比较复杂的东西的组成过程。比如电脑组成、手机组成、电视组成、等等。就拿电脑组成来说。可以由主板、Cpu、显卡等等组成。但是组成的算法步骤是一样的。只是不同的东西组装起来结果不一样而已。 建造者模式介绍 一、 来由   在软件编程的过程我们是否也会遇到类似电脑组装这类的问题呢?当然是会的。组装一个电脑我们就一次,那岂不是要累死了。类似于这种组装算法固定但是各个部分又不稳定经常变化的情况。并且对象组装较为复杂。为了面对解决这种情况。所以有建造者模式。建造者模式到底是如何解决问题的呢?我们一起看看吧。 二、 意图   将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 三、 案例图 四、 建造者模式代码示例   在建造者模式中一般包含如下成分: 抽象建造者: 抽象建造者为创建复杂产品对象的各个部分指定抽象创建接口 具体建造者: 继承抽象建造者,实现抽象创建接口。指定创建的类型。创建各个具体的部分。 产品角色: 复杂产品对象,将各个部分组成产品的接口 指挥者: 调用各个部分,按固定的算法创建。不涉及到具体产品类的信息。仅负责各个部分完整的创建 就组装电脑来说

建造者模式5(7)

江枫思渺然 提交于 2019-11-28 18:01:55
简单理解:指挥者、建造者、建造对象三者之间的关系 package Creating.pratice; public class BuilderPMain { public static void main(String[] args) { BuilderP b = new BuilderExecutor(); Director d = new Director(b);//指挥者拥有多个建造者 ProductRoleP p = d.construct();//建造者的行为 System.out.println(p.toString()); } } class ProductRoleP{ private String pName; private String pType; public String getpName() { return pName; } public void setpName(String pName) { this.pName = pName; } public String getpType() { return pType; } public void setpType(String pType) { this.pType = pType; } @Override public String toString() { return

学习设计模式 - 建造者模式

六月ゝ 毕业季﹏ 提交于 2019-11-28 10:48:26
学习设计模式 - 建造者模式 一、是什么 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。(Spearate the construction of a compolex object from its representation so that the same construction process can create different representations.) 二、为什么    1. 如果一个对象的组成过于复杂,可以通过建造者模式,将构造过程抽离出来,一步步构造对象   2. 可以更精细的控制生成对象   3. 由于对象构造过程过于复杂, 使用建造者模式可以屏蔽对象的内部复杂性, 减少客户端对复杂对象的了解 三、怎么样       3.1) Product产品类:     需要构建复杂的产品类   3.2) Builder构建接口     可定义了构建部分构建的接口方法, 以及构建整个对象的方法.   3.3) ConreteBuilder具体构建者     实现了Builder接口.   3.3) Direct导演类     导演类一方面封装导演了构建组件的构成, 另一方面屏蔽客户端对构建过程的深入了解.    四、举例       1. 产品类 public class Computer { private String cpu

Java设计模式14:建造者模式

血红的双手。 提交于 2019-11-28 10:44:57
什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家。 建造者模式是什么呢?用一句话概括就是建造者模式的目的是 为了分离对象的属性与创建过程 ,是的,只要记住并理解红字的几个部分,建造者模式你就懂了。 为什么需要建造者模式 建造者模式是构造方法的一种替代方案,为什么需要建造者模式,我们可以想,假设有一个对象里面有20个属性: 属性1 属性2 ... 属性20 对开发者来说这不是疯了,也就是说我要去使用这个对象,我得去了解每个属性的含义,然后在构造函数或者Setter中一个一个去指定。更加复杂的场景是,这些属性之间是有关联的,比如属性1=A,那么属性2只能等于B/C/D,这样对于开发者来说更是增加了学习成本,开源产品这样的一个对象相信不会有太多开发者去使用。 为了解决以上的痛点,建造者模式应运而生,对象中属性多,但是通常重要的只有几个,因此建造者模式会 让开发者指定一些比较重要的属性 或者让开发者 指定某几个对象类型 ,然后让建造者去实现复杂的构建对象的过程,这就是对象的属性与创建分离。这样对于开发者而言隐藏了复杂的对象构建细节,降低了学习成本,同时提升了代码的可复用性。 虽然感觉基本说清楚了,但还是有点理论,具体往下看一下例子。 建造者模式代码示例 举一个实际场景的例子: 大家知道一辆车是很复杂的,有发动机、变速器、轮胎

设计模式-建造者模式详解

孤街浪徒 提交于 2019-11-28 06:37:07
一、建造者模式的概念   建造者模式属于创建型设计模式。   指的是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。   建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。   建造者模式主要涉及几个角色:   1、指挥者(Director),负责和客户(Client)对话   2、之后指挥者将客户的产品需求划分为比较稳定的建造过程(AbstractBuilder)   3、指挥者指挥具体的建造者(ConcreteBuilder)干活   4、获取建造者建造的产品给客户   比如组装电脑这个场景,CPU、主板、硬盘和内存等配件是相对稳定的,组装过程也是相当稳定的,先装CPU、内存、硬盘和电源等等(AbstractBuilder),但是配件搭配的方式是多变的(Builder可以多个),如组装家用电脑、游戏电脑。 二、建造者模式的实现   1、先来一个产品类(电脑) namespace BuilderPattern { using System; using System.Collections.Generic; /// <summary> /// 电脑类 /// </summary> public

java设计模式----建造者模式

两盒软妹~` 提交于 2019-11-27 23:50:58
建造者模式使用场景:将复杂的实现与应用进行分离。主要有四个类:产品类(Product)、建造抽象类(Builder)、建造实现类(ConcreteBuilder)、指挥者类(Director)。建造者模式仅仅只比工厂模式多了一个“指挥类”的角色。在建造者模式图中,假如把这个指挥类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——指挥类。 产品类 package build; public class Product { private String food; private String water; public Product() { } public Product(String food, String water) { this.food = food; this.water = water; } public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getWater() { return water; } public void setWater

建造者(Builder)设计模式

十年热恋 提交于 2019-11-27 14:01:33
建造者(Builder)设计模式 1.0.0 产生建造者模式的原因     在类的数据特别复杂的时候,创建一个类需要花费很长的时间,因为有些类需要根据不同的场合进行不同的初始化。在类结构比较复杂,而且初始化比较困难的情况下,封装好的类创建步骤可以减少工作量,提高稳定性。这就是为什么需要建造者模式的原因。 2.0.0 什么是建造者模式? 将复杂对象的构建和对象的表示分离,使得同样的构建过程可以创建不同的表示。 3.0.0 建造模式的使用场景 复杂对象的创建(参数较多,而且比较初始化困难)--->创建的封装 4.0.0 建造者模式的对象 产品对象 抽象建造器 具体建造器 指挥者 5.0.0 建造者模式的一般实现 @Slf4j public class BuilderPattern { class CarDirector { private IBuilder builder; public CarDirector(IBuilder builder) {this.builder = builder;} public Car construct() { builder.buildWheel(); builder.buildBody(); builder.buildEngine(); return builder.build(); } } interface IBuilder { void