建造者

设计模式3-建造者模式

流过昼夜 提交于 2020-01-09 00:22:26
1. 介绍 1.1 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 1.2 主要作用 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 用户只需要给出指定复杂对象的类型和内容; 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来) 1.3 解决的问题 方便用户创建复杂的对象(不需要知道实现过程) 代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用) 例子:造汽车 & 买汽车。 1. 工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内) 2. 汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了 (不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等)) 2. 模式原理 2.1 UML类图 & 组成 模式讲解: 1. 指挥者(Director)直接和客户(Client)进行需求沟通; 2. 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder); 3. 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder); 4. 各个具体建造者负责进行产品部件的构建; 5. 最终构建成具体产品(Product)。 2.2 实例讲解 接下来我用一个实例来对建造者模式进行更深一步的介绍。 a. 实例概况 背景

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

两盒软妹~` 提交于 2020-01-08 18:19:41
建造者模式(Builder Pattern): 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 作用: 在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 (1)用户只需要给出指定复杂对象的类型和内容 (2)建造者模式负责按顺序创建复杂对象(把内容的建造过程和细节隐藏起来) 解决问题: 抽象工厂模式解决了"系列产品"的需求变化,而建造者模式解决的是"产品部分"的需要变化 1>方便用户建造复杂的对象(不需要知道实现过程) 2>代码复用性,封装性(将对象构造过程和细节进行封装&复用) 产品(Product):产品类,规定了产品的组成部件。这里的产品是同一类产品。 抽象建造者(Builder):为一个产品(Product)对象的各个部件提供了一个抽象接口 具体建造者(ConcreteBuilder):实现Builder接口,根据具体的要求建造和装配各个部件 指挥者(Director):用来指挥创建过程,直接和客户(Client)进行需求沟通,构建了一个使用builder接口的对象 具体流程: 1.指挥者(Director)和客户交流,获取客户需要什么产品 2.指挥者交流后知道了产品需求,根据需求来决定产品部件的构造,统一分给各部门相应的建造者(Builder) 3.各部门再安排给具体的生产小组(ConcreteBuilder),造出部件 4

建造者模式(Builder)

吃可爱长大的小学妹 提交于 2020-01-08 05:34:46
建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 建造者模式通常包括下面几个角色: 1. 生成器builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。 为创建一个Product对象的各个部件指定抽象接口; 2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。 定义并明确它所创建的表示; 提供一个检索Product的接口; 3. 导向器Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。 构造一个使用Builder接口的对象; 4. Product:表示要创建的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程; 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。 在建造者模式中,Director规定了创建一个对象所需要的步骤和次序,Builder则提供了一些列完成这些步骤的方法,ConcreteBuilder给出了这些方法的具体实现,是对象的直接创建者。   建造者模式的结构图                    协作 •

设计模式——建造者模式

寵の児 提交于 2020-01-02 17:43:56
没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。 游戏角色设计 Sunny软件公司游戏开发小组决定开发一款名为《Sunny群侠传》的网络游戏,该游戏采用主流的RPG(Role Playing Game,角色扮演游戏)模式,玩家可以在游戏中扮演虚拟世界中的一个特定角色,角色根据不同的游戏情节和统计数据(如力量、魔法、技能等)具有不同的能力,角色也会随着不断升级而拥有更加强大的能力。 作为RPG游戏的一个重要组成部分,需要对游戏角色进行设计,而且随着该游戏的升级将不断增加新的角色。不同类型的游戏角色,其性别、脸型、服装、发型等外部特性都有所差异,例如“天使”拥有美丽的面容和披肩的长发,并身穿一袭白裙;而“恶魔”极其丑陋,留着光头并穿一件刺眼的黑衣。 Sunny公司决定开发一个小工具来创建游戏角色,可以创建不同类型的角色并可以灵活增加新的角色。 Sunny公司的开发人员通过分析发现,游戏角色是一个复杂对象,它包含性别、脸型等多个组成部分,不同的游戏角色其组成部分有所差异,如图8-1所示: 注

设计模式--建造者模式

ぐ巨炮叔叔 提交于 2020-01-01 03:02:52
  建造者模式(builder),将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。 1 package com.sun.builder; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * 产品类 由多个部件组成 8 * 9 * @author sunafei 10 * 11 */ 12 public class Product { 13 List<String> parts = new ArrayList<String>(); 14 15 public void add(String part) {//添加产品部件 16 this.parts.add(part); 17 } 18 19 public void show() {//列举所有产品部件 20 System.out.println("产品创建"); 21 for (String part : parts) { 22 System.out.println(part); 23 } 24 } 25 } 1 package com.sun.builder; 2 3 /** 4 * 抽象建造者类,确定产品有两个部件组成,并声明一个得到产品建造后结果的方法getResult 5 * @author SunAFei 6 *

建造者模式

南楼画角 提交于 2020-01-01 03:01:30
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。 /** * 产品类,由多个部件组成 */ public class Product { ArrayList list = new ArrayList(); /** * 添加产品的部件 * * @param part */ public void Add(String part) { list.add(part); } public void Show() { System.out.println("\n 产品 创建 ----"); for (Object part : list) {//列举所有的产品部件 System.out.println(part); } } } /** * 抽象建造者,确定产品由两个部件组成,并声明一个得到产品建造后结果的方法 */ public abstract class Builder { public abstract void BuilderPartA(); public abstract void BuilderPartB(); public abstract Product GetResult(); } /** * 具体建造者类 */ public class

建造者模式

拈花ヽ惹草 提交于 2020-01-01 02:56:58
建造者模式:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式结构图: php实现: <?php class Product{ public $part1; public $part2; public function setPart1($v){ $this->part1 = $v; } public function setPart2($v){ $this->part2 = $v; } } abstract class Builder{ public abstract function BuildPart1($v); public abstract function BuildPart2($v); } class concreteBuilder extends Builder{ private $product; public function __construct(){ $this->product = new Product(); } function BuildPart1($v1){ $this->product->setPart1($v1); } function BuildPart2($v2){ $this->product->setPart2($v2);; } function getProduct(){ return

Chapter9:建造者模式

拜拜、爱过 提交于 2019-12-27 14:49:52
建造者模式(Builder) ,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 “建造者(Builder)模式”又叫生成器模式。当我们用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。它主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。 建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。 实际应用 工程结构 (1)抽象建造者Builder.h (2)具体建造者ConcreteBuilder.h (3)指挥者Director.h (4)具体产品Product.h (5)客户端类BuilderApp.cpp (1)抽象建造者Builder.h /************************************************************************ * description: 抽象建造者类 * remark: ***************************************************

一篇文章就彻底弄懂建造者模式(Builder Pattern)

戏子无情 提交于 2019-12-27 03:34:56
转载: https://www.jianshu.com/p/3d1c9ffb0a28 背景 当一个类的内部数据过于复杂的时候(通常是负责持有数据的类,比如Config、VO、PO、Entity...),要创建的话可能就需要了解这个类的内部结构,还有这些东西是怎么组织装配等一大坨乱七八糟的东西,这个时候就会增加学习成本而且会很混乱,这个时候就想啊想一种什么法子来管理一下这个类中的数据呢,怎么在创建的时候让它按部就班的来,并且代码可读性很好别让我看花了眼啊,我要的东西也能都很好设置进来,这就是Builder模式的应用场景,Builder模式可以将一个类的构建和表示进行分离。 1.介绍 1.1什么是构建者模式 创建者模式又叫建造者模式,是将一个复杂的对象的 构建 与它的 表示 分离,使 得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。 1.2适用场景: 隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果 多个部件都可以装配到一个对象中,但产生的运行结果不相同 产品类非常复杂或者产品类因为调用顺序不同而产生不同作用 初始化一个对象时,参数过多,或者很多参数具有默认值 Builder模式不适合创建差异性很大的产品类 产品内部变化复杂

建造者模式

折月煮酒 提交于 2019-12-26 12:05:33
建造者模式 ,将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示。 建造者模式能够将一个产品的内部表象与产品的生成过程切割开来,从而能够使一个建造过程生成具有不同的内部表象的产品对象。 假设我们使用了建造者模式。那么用户就仅仅需指定须要建造的类型就能够得到他们,而详细建造的过程和细节就不须要知道了。 Product就是详细产品类,由多个部件组成。 Builder是为创建一个Product对象的各个部件指定的抽象接口。 ConcreteBuilder是详细的建造者,实现Builder的接口。构造和装配各个部件。 指挥者Director就是依据需求的详细建造步骤。 建造者模式的优点 就是使得建造代码与表示代码分离,因为建造者隐藏了该产品是怎样组装的,所以若须要改变一个产品的内部表示,仅仅须要再定义一个详细的建造者就能够了。 代码: //Builder.h #include "stdafx.h" #include <iostream> #include <string> using namespace std; class Product { private: std::string _partA; std::string _partB; std::string _partC; public: void SetPartA(const string& partA) {