建造者

创建模式 -- 建造者模式

混江龙づ霸主 提交于 2019-11-27 10:50:35
一、小案例分析 1、功能需求:   现需要建房子,建房流程:挖地基、砌墙、封顶。对于不同种类的房子(高楼,别墅),流程虽然一样,但是具体功能实现不同。如何实现建房子? 2、小菜鸡的答案: (1)定义一个抽象接口,并定义三个抽象方法(挖地基、砌墙、封顶)。 (2)对于不同种类的房子,实现该接口,并重写相关方法即可。 (3)代码实现: package builder.pattern; /** * 测试类 * */ public class BuilderDemo { public static void main(String[] args) { System.out.println("建别墅流程:"); BuilderHouse villa = new Villa(); System.out.println("\n建高楼流程"); BuilderHouse highBuild = new HighBuild(); } } /** * 定义一个建房子的接口,并定义其流程 */ interface BuilderHouse { void scoopHole(); // 挖地基 void buildWall(); // 砌墙 void topOff(); // 封顶 } /** * 建别墅,实现建房子的接口 * */ class Villa implements BuilderHouse

创建型模式之建造者模式(2.1)

被刻印的时光 ゝ 提交于 2019-11-27 03:49:41
什么是建造者模式? 工厂模式聚焦于创建出一个对象,而建造者除此之外还需要为创建的对象赋值。 简单来说,建造者模式=创建对象+属性赋值。 建造者模式应用场景 建造者模式适合创建 类中包含多个参数且需要定制化 的情况。 简单来说,建造者模式的目的就是创造 一条龙服务 :不仅创建出对象,顺便给属性赋值。 以计算机为例,计算机的性能大致由CPU,显卡,内存,硬盘这几个属性构成。 市面上更多的是已经组装好的成品,而不会让用户自己去配一台电脑出来。(当然自己也是可以配的) 市场根据需求分为游戏本,办公本以及娱乐本等等。不同的种类性能是不一样的。但会在一个大致的范畴。 如果将所有的CPU,显卡,硬盘等等排列组合,电脑的种类将难以计数。所以官方推出定制本不仅缩小了选择的难度。也提供了生产的方便。 写个Demo实现: 虚线以上可以理解为服务端,一下可以理解为客户端。 那么生产一个产品的流程大致是这样的:实例化一个建造者实现类和一个指挥者装配类,调用指挥者转配类中的build方法实现建造者实现类的setter方法从而达到实例化产品的目的。 为什么需要建造者接口类和建造者实现类? 接口类控制的是产品的生产标准(实例化标准),每一个具体的产品都需要实现该接口完成产品创建。 优点:提升了扩展性。(客户端也可以通过接口的实现来创建自定义产品) 为什么需要指挥者装配类?

设计模式之创建类模式PK

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-27 00:36:12
创建类模式包括: 工厂方法模式 建造者模式 抽象工厂模式 单例模式 原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象,这两个不容易混淆. 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步的精确构造创建出一个复杂的对象. 工厂方法模式和建造者模式的区别: 意图不同. 在工厂方法模式中, 我们关注的是产品的整体,无需关心产品的各部分是如何创建出来的; 但是在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是"由零件一步一步地组装出产品对象". 简单地说, 工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程. 产品的复杂度不同. 工厂方法模式创建的产品一般都是单一性质产品,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,不见不同产品对象当然不同. 在具体应用中如何选择呢?这取决于我们在做系统设计时的意图, 如果需要详细关注一个产品不见的生产、安装步骤,则选择建造者 ,否则选择工厂方法模式 抽象工厂模式VS建造者模式 抽象工厂模式实现对产品家族的创建, 一个产品家族是这样一系列产品:

设计模式之创建类模式大PK

对着背影说爱祢 提交于 2019-11-27 00:35:54
创建类模式大PK 创建类模式包括 工厂方法模式 、 建造者模式 、 抽象工厂模式 、 单例模式 和 原型模式 ,他们能够提供对象的创建和管理职责。其中单例模式和原型模式模式非常容易理解,单例模式是要保持在内存中只有一个对象,原型模式是通过复制的方式产生一个新的对象。而工厂方法模式、抽象工厂模式和建造者模式,这三者之间有较大的相似性。 工厂方法模式VS建造者模式 工厂方法模式注重的是整体对象的创建方法,而建造者模式注重的是部件构建的过程,旨在通过一步一步地精确构造创建出一个复杂的对象。就拿造车来说吧,工厂方法模式,直接生产出来的就是奔驰、宝马和大众;而建造者模式则不同了,则需要创建车胎、引擎、车门、座椅、车灯等等,然后组装成一辆奔驰或者宝马车。如下我们分别介绍两种模式的造车过程。 工厂方法模式造车 首先工厂方法模式的类图如下,其中我们将车辆分为三种奔驰、宝马、大众,定义一个接口,在定义三种车型的创建实现,通过汽车制造工厂生产汽车。通过类图代码略。 建造者模式造车 建造者模式设计一个车需要先把车进行拆分,分为引擎、车轮和车体三部分,然后由建造者进行建造,并通过设计图纸建造车辆,注重零件的配合、组装和封装从一个细微构件角度看待一个对象,建造者模式的类图如下。 这个看起来还有点复杂呢,我们还是看看通用类图的源码吧,一点一点的分析一下,首先我们还是先看看这个奔驰和宝马汽车吧

创建类模式大PK(总结)

℡╲_俬逩灬. 提交于 2019-11-27 00:35:41
创建类模式包含工厂方法模式、建造者模式、抽象工厂模式、单例模式和原型模式,它们都可以提供对象的创建和管理职责。当中的单例模式和原型模式很easy理解,单例模式是要保持在内存中仅仅有一个对象,原型模式是要求通过复制的方式产生一个新对象。这两个不easy混淆。以下主要分析其他三种模式。 一、工厂方法模式VS建造者模式 1、意图不同 在工厂方法模式里,关注的是一个产品总体,无须关心产品的各部分是怎样创建出来的。但在建造者模式中,一个详细产品的产生是依赖各个部件的产生以及装配顺序。它关注的是“由零件一步一步地组装出产品对象”,简单地说,工厂模式是一个对象创建的粗线条应用。建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程。 2、产品的复杂度不同 工厂方法模式创建的产品一般都 是单一性质产品,而建造者模式创建的则是一个复合产品,它由各个部件复合而成。部件不同产品对象当然不同。这不是说工厂方法模式创建的对象简单。而是指它们的粒度大小不同。 一般来说,工厂方法模式的对象粒度比較粗,建造者模式的产品对象粒度比較细。 实践:假设须要具体关注一个产品部件的生产、安装步骤,则选择建造者,否则工厂。 二、抽象工厂模式VS建造者模式 抽象工厂模式就像一个巨头有很多“工厂”,使用“工厂”来描写叙述构建者。而建造者模式就像一个工厂有很多“车间”。使用“车间”来描写叙述构建者

设计模式之十一(建造者模式)

十年热恋 提交于 2019-11-26 23:42:21
原文: 设计模式之十一(建造者模式) 前言 建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结构图 Builder是为创建一个Product对象的各个部件指定的抽象接口。 ConcreteBuilder是具体的建造者,实现Builder接口,构造和装配各个部件。可以有多个不同的具体的建造者。 Product具体产品角色 Director就是构建一个使用Builder接口的对象。 代码实现 首先来看一下产品类 public class Product { List<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("\n产品 创建…………"); foreach (string part in parts) { Console.WriteLine(part); } } } 第一个Add方法主要是为产品添加部件 第二个Show就是展示产品所拥有的部件 Builder类---抽象建造类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult。 public abstract class Builder {

设计模式之十一(建造者模式)

人盡茶涼 提交于 2019-11-26 23:42:00
前言 建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结构图 Builder是为创建一个Product对象的各个部件指定的抽象接口。 ConcreteBuilder是具体的建造者,实现Builder接口,构造和装配各个部件。可以有多个不同的具体的建造者。 Product具体产品角色 Director就是构建一个使用Builder接口的对象。 代码实现 首先来看一下产品类 public class Product { List<string> parts = new List<string>(); public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("\n产品 创建…………"); foreach (string part in parts) { Console.WriteLine(part); } } } 第一个Add方法主要是为产品添加部件 第二个Show就是展示产品所拥有的部件 Builder类---抽象建造类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法GetResult。 public abstract class Builder { public abstract void

建造者模式

ⅰ亾dé卋堺 提交于 2019-11-26 20:15:29
建房子要怎么建?    首先要有一个包工头,即指挥者。为什么要请个包工头呢,因为包工头知道建房子的流程:首先打地基、然后建墙体,然后封顶,最后是装修。   除此之外,包工头还能根据客户的需求来盖不同类型的房子,比如普通楼房和别墅。   当然,少不了一批帮包工头干活的人,即建造者Builder 。 用代码描述: 1 #include <string> 2 #include <iostream> 3 #include <vector> 4 using namespace std; 5 6 // 建筑队,打地基、筑墙、盖顶、装修都会 7 class Builder 8 { 9 public: 10 virtual void DaDiJi ()=0; 11 virtual void ZhuQiang ()=0; 12 virtual void GaiDing ()=0; 13 virtual void ZhuangXiu ()=0; 14 }; 15 // 建楼房 16 Class LouFangBuilder : public Builder 17 { 18 public: 19 virtual void DaDiJi () 20 { 21 cout<<"楼房打地基"<<endl; 22 } 23 virtual void ZhuQiang () 24 { 25 cout<<"楼房筑墙"

建造者模式

妖精的绣舞 提交于 2019-11-26 20:15:10
设计模式之建造者设计模式(也叫 生成器模式 ) 建造者模式就是将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示 1:使用建造者模式的话,它封装了一个产品的构造过程,并且允许按照预定的步骤构造产品。 同时,向客户端隐藏了产品的内部表现 2:一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险 建造者模式与工厂模式的区别 1:工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端 总结 建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造 很复杂 ,那么请用工厂模式;如果产品的建造 更复杂 ,那么请用建造者模式 建造者模式: 1:Buider是一个抽象接口,是各个零件制定的抽象接口 2: ConcreteBuilder:是实现Buider接口的具体的类,构建和装配各个零件,达到我们想要的组件 3:Director

建造者模式

余生长醉 提交于 2019-11-26 20:14:52
意图: 将复杂对象的表现形式同其构造相分离,这样,同样的构造过程就可以产生不同的表现形式。 结构图: 对于一个复杂的对象,其各个部分可能会需要使用不同的算法,或者是创建过程,但是,虽然各个部分的需求会产生变动,但是作为构造一个整体的过程:需要创建的部分,各个部分的创建顺序等,保持相对的稳定。在系统创建这样的对象时,通过采用建造者模式,可以将对象的表现形式和其创建过程分离开来,同时,通过 Director 类降低了系统对对象创建的耦合性。 通常,建造者模式的使用有如下流程: 具体而言,当我们需要组建一个房间(对应上图的 Client ),其中包括了床 (Bed) ,书桌( Desk ),椅子( Chair )等东西。 Room::CreateRoom(){ bed = new Bed(); desk = new Desk(); chair = new Chair(); } 当对床,书桌和椅子的需求变动,或者需要加入新的东西时,需要改动 Client 中的代码(即上面代码中的 Bed(),Desk(),Chair() 或者新加入如 Mirror * mirror = new Mirror() )。通过采用建造者模式,先构造一个 Director 来管理对象的创建。 class Director{ public: Director(Builder* builder){_builder =