【UE4 设计模式】建造者模式 Builder Pattern
概述
描述
建造者模式,又称生成器模式。是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成与装配方式,主需要知道所需的建造者即可。类似工厂方法,但是建造者模式返回一个完整的复杂产品,而抽象工厂模式则返回一系列相关的产品。以汽车为例,工厂方法可以看成不同汽车配件的生成,而建造者模式则可以看成时汽车的组装

套路
- Builder:抽象建造者
为创建一个产品对象的各个部件指定抽象接口,一般包含两个接口方法:一个用于创建复杂对象的各个部件;另一个用于返回生成好的复杂对象。它就可以是抽象类,也可以是接口。 - ConcreteBuilder:具体建造者
实现了Builder接口,即实现了各个部件的具体构造和装配方法,定义并明确其所创建的复杂对象。 - Product:产品角色
被构建的复杂对象,包含多个组成部件。 - Director:指挥者
负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其Construct()方法中调用建造者对象的部件构造和装配方法,完成复杂对象的建造。
使用场景
- 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
- 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
- 示例
- 不同门派角色生成,具有不同的服装、武器、发型
- 不同地图生成,如道路、植被、天气、怪物。
- 武器组装
优缺点
- 优点
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 用户使用不同的具体建造者即可得到不同的产品对象 。
- 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
- 缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间的差异性很大,则不适合使用,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
UE4 实践
做一个简单得门派生成器
创建具体赋值产品 —— 门派角色角色
// 复杂产品 —— 门派角色
UCLASS(Blueprintable, BlueprintType)
class DESIGNPATTERNS_API USectPlayer : public UObject
{
GENERATED_BODY()
public:
// 门派
FString Sect = TEXT("None");
// 性别
FString Render = TEXT("None");
// 服装
FString Costume = TEXT("None");
// 武器
FString Weapon = TEXT("None"); // 展示信息
void ShowInfo() {
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" %s %s %s %s"), *Sect, *Render, *Costume, *Weapon);
}
};
创建抽象建造者 —— 角色构造器,具体建造者 —— 纯阳角色构造器、七秀角色构造器
// 抽象建造者 —— 角色构造器
UCLASS(Abstract)
class DESIGNPATTERNS_API USectPlayerBuilder : public UObject
{
GENERATED_BODY()
public:
// 构造函数创建复杂角色实例
USectPlayerBuilder() { SectPlayer = NewObject<USectPlayer>(); } // 各个构建部分
virtual void BuilderSect(){}
virtual void BuilderRender(){}
virtual void BuilderCostume(){}
virtual void BuilderWeapon(){} // 返回角色实例
USectPlayer* GetPlayer() { return SectPlayer; }
protected:
USectPlayer* SectPlayer;
}; // 具体建造者 —— 纯阳角色构造器
UCLASS(Blueprintable, BlueprintType)
class DESIGNPATTERNS_API UChunYangSectPlayerBuilder : public USectPlayerBuilder
{
GENERATED_BODY()
public:
virtual void BuilderSect() override { SectPlayer->Sect = TEXT("纯阳门派"); }
virtual void BuilderRender() override { SectPlayer->Render = TEXT("男"); }
virtual void BuilderCostume() override { SectPlayer->Costume = TEXT("纯阳服装"); }
virtual void BuilderWeapon() override { SectPlayer->Weapon = TEXT("纯阳武器"); }
}; // 具体建造者 —— 七秀角色构造器
UCLASS(Blueprintable, BlueprintType)
class DESIGNPATTERNS_API UQiXiuSectPlayerBuilder : public USectPlayerBuilder
{
GENERATED_BODY()
public:
virtual void BuilderSect() override { SectPlayer->Sect = TEXT("七秀门派"); }
virtual void BuilderRender() override { SectPlayer->Render = TEXT("女"); }
virtual void BuilderCostume() override { SectPlayer->Costume = TEXT("七秀服装"); }
virtual void BuilderWeapon() override { SectPlayer->Weapon = TEXT("七秀武器"); }
};
创建指挥者(Director) —— 角色创建指挥者
// 指挥者(Director) —— 角色创建指挥者
UCLASS(Blueprintable, BlueprintType)
class DESIGNPATTERNS_API UPlayerCreateDirectory : public USectPlayerBuilder
{
GENERATED_BODY()
public:
USectPlayer* Construct(USectPlayerBuilder* SectPlayerBuilder) {
// 逐步构建复杂角色
SectPlayerBuilder->BuilderSect();
SectPlayerBuilder->BuilderRender();
SectPlayerBuilder->BuilderCostume();
SectPlayerBuilder->BuilderWeapon(); return SectPlayerBuilder->GetPlayer();
}
};
测试调用
// 调用测试用的Actor
UCLASS()
class DESIGNPATTERNS_API APlayerBuilder : public AActor
{
GENERATED_BODY()
public: void BeginPlay() override { // 创建指挥者
UPlayerCreateDirectory* PlayerCreateDirectory = NewObject<UPlayerCreateDirectory>(); // 指定纯阳角色构造器生成角色
USectPlayer* ChunYangPlayer = PlayerCreateDirectory->Construct(NewObject<UChunYangSectPlayerBuilder>());
ChunYangPlayer->ShowInfo(); // 指定七秀角色构造器生成角色
USectPlayer* QiXiuPlayer = PlayerCreateDirectory->Construct(NewObject<UQiXiuSectPlayerBuilder>());
QiXiuPlayer->ShowInfo();
}
};
调式输出
LogTemp: Warning: APlayerBuilder::BeginPlay 纯阳门派 男 纯阳服装 纯阳武器
LogTemp: Warning: APlayerBuilder::BeginPlay 七秀门派 女 七秀服装 七秀武器
参考
【UE4 设计模式】建造者模式 Builder Pattern的更多相关文章
- 设计模式 - 建造者模式 Builder Pattern
简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- 建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
随机推荐
- Redis的持久化机制与内存管理机制
1.概述 Redis的持久化机制有两种:RDB 和 AOF ,这两种机制有什么区别?正式环境应该采用哪种机制? 我们的服务器内存资源是有限的,如果内存被Redis的缓存占满了怎么办?这就要看Redis ...
- python 并行计算
一.进程和线程 原文链接:https://zhuanlan.zhihu.com/p/356220352 进程是分配资源的最小单位,线程是系统调度的最小单位.当应用程序运行时最少会开启一个进程,此时计算 ...
- noip模拟43
A. 第一题 儿子遍历顺序按深度由小到大即可 B. 第二题 二分最小值,以点权作为初始距离跑最长路即可 直接用大根堆跑 \(dij\) 会 \(T\),考虑初始权值可以处理,且边权一定,用类似蚯蚓的方 ...
- HZ游记
HZ 游记 Day -1 收拾东西,准备出发. 话说这几天一直比较懒,也没什么心情和效率学习,颓废好几天了,希望到衡水以后能感觉好点. 不知道衡水有没有妹子 非常想看看衡水的样子,但是又害怕封闭式教学 ...
- Merchant
\(get\)二分新用法. 每道题都有答案范围提示,以前只是以为是用来提示用什么类型输出的. 从来没想过直接用它来二分. 这道题真的刷新了我的认知啊...... 整道题的复杂度是\ ...
- uniapp 获取用户手机号
参考资料: 微信小程序官方文档 uniapp开发微信小程序获取用户手机号 页面增加一个按钮 <button open-type="getPhoneNumber" @getph ...
- C# Dapper基本三层架构使用 (二、Model)
我们将数据存放在数据库中,数据表的结构,我们通常会用一个类来抽象,表的属性就是类的属性,我们通常将表的一行存储在一个类中. 在Java中,通常将其称为实体类Entity,在C#中,通常将其称为Mode ...
- 马哈鱼数据血缘分析器分析case-when语句
马哈鱼数据血缘分析器是一个分析数据血缘关系的平台,可以在线直接递交 SQL 语句进行分析,也可以选择连接指定数据库获取 metadata.从本地上传文件目录.或从指定 git 仓库获取脚本进行分析. ...
- 【第一篇】- Maven 系列教程之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven 教程 Maven 翻译为"专家"."内行",是 Apache 下的一个纯 Java 开发的开源项目.基于项目对象模型(缩写:POM)概念,Maven ...
- python多继承简单方法
class people(object): #建创一个人类 def __init__(self,name,age): self.name = name self.age = age def eat(s ...