目录

描述

套路

使用场景

优缺点

UE4实践

具体复杂产品-门派角色

抽象建造者-角色构造器

具体建造者-纯阳角色构造器

具体建造者-七秀角色构造器

创建指挥者(Director)-角色创建指挥器


描述

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

套路

  • Builder:抽象建造者

    • 为创建一个产品对象的各个部件指定抽象接口,一般包含两个接口方法:一个用于创建负责对象的各个部件;另一个用于返回生成好的复杂对象。
  • ConcreteBuilder:具体建造者
    • 实现了Builder接口,既实现了各个部件的具体构造和装配方法,定义并明确其所创建的负责对象
  • Product:产品角色
    • 被构建的复杂对象,包含多个组成部件
  • Director:指挥者
    • 负责安排复杂对象的建造次序,指挥者与抽想Builder存在关联关系,可以再其Construct()方法中调用建造者对象的部件构造和装配方法,完成复杂对象的建造

使用场景

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
  • 对象的创建过程独立于创建该对象的类,在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类
  • 示例
    • 不同门派角色生成,具有不同的服装、武器、发型
    • 不同地图生成,如道路、植被、天气、怪物
    • 武器组装

优缺点

  • 优点

    • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
    • 用户使用不同的具体Builder即可得到不同的产品对象
    • 可以更加精细的控制产品的创建过程,将复杂产品的创建分解在不同的方法中,使得创建过程更加清晰,也方便使用程序来控制创建过程
    • 增加新的具体Builder无需更改原有的代码,指挥者类针对抽象Builder编程,系统扩展方便,符合开闭原则
  • 缺点
    • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异很大,则不适合使用,因此使用范围受到一定限制
    • 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

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 C++设计模式:建造者模式(Builder Pattern)相关推荐

  1. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  2. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  3. Net设计模式实例之建造者模式(Builder Pattern)(2)

    四.案例分析(Example) 1.场景 假设房子只有房顶和墙(Roof And Walls)<?XML:NAMESPACE PREFIX = O /> Jane和 Joe两个客户需要从建 ...

  4. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  5. 大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示

    一句话概括: 使用多个简单对象一步一步构建成复杂对象,将复杂对象的构建与表示相分离. 补充介绍: 建造者模式(Builder Pattern)中有一个 Builder 类,这个类会一步一步构造最终的对 ...

  6. 人人都会设计模式---建造者模式--Builder

    PS:转载请注明出处 作者: TigerChain 地址: www.jianshu.com/p/300cbb9ee- 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1.阅读对象 本 ...

  7. 大话设计模式--建造者模式 Builder -- C++实现实例

    1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...

  8. 设计模式-建造者模式 builder

    建造者者模式角色: 具体产品(抽象产品) 抽象建造者 具体建造者 指挥者(director) 拓展:当一个类属性过多时,造对象不便捷采用 静态内部类 链式 创建对象 package com.qf.bu ...

  9. java设计模式建造_Java设计模式——建造模式(Builder Pattern)

    Builder模式常用例子 今天就简单粗暴的介绍一下Builder模式概念和使用. Dialog的创建 AlertDialog dialog = new AlertDialog.Builder(thi ...

最新文章

  1. 使用NFS启动Tiny4412开发板根文件系统
  2. 关于EventSource的精华
  3. 记一次windows的安装
  4. 如何使用通用Mapper
  5. mysql 全表连接_MySQL学习—多表查询(内连接,外链接,全连接)
  6. 如何删除虚拟机上的操作系统、删除新建的虚拟机
  7. filter在ios不兼容 js_jq的animate属性不支持transform 和 ios手机上box-shadow兼容性问题 和...
  8. 推荐系统系列教程之十二:Facebook是怎么为十亿人互相推荐好友的?
  9. 向设计师分享30个免费的扁平化风格设计素材
  10. ANSYS18.2/HFSS18.2安装步骤
  11. _beginthread
  12. 虚拟偶像养成记:人工智能人格化与IP化打造出完美“爱豆”
  13. u盘启动盘恢复计算机,怎么还原u盘启动盘为普通u盘?
  14. C语言:输入日期,计算该日期是该年的第几天。
  15. AHU 数据结构 最短路径 安大地图版本
  16. 计算机创新创业计划2000字,创新创业论文2000字
  17. 三天打鱼两天晒网C++
  18. vue路由报错Navigating to current location (“/login“) is not allowed踩坑总结
  19. Webpack5快速入门 (二) CSS相关loader的使用及兼容性处理 手把手带你打开前端工程化的大门
  20. Linux中静态库和动态库(共享库)的区别

热门文章

  1. SpringBoot通过JPA连接Mysql集群
  2. 鬼 谷 子 --常读之
  3. 创建学生选课成绩的数据库的语句
  4. django-channels(websocket)
  5. springboot整合redis分别实现手动缓存和注解缓存
  6. 数据结构——双向链表(双向连接的图解、双向链表的创建、操作双向链表)
  7. c语言norm函数的作用,带有示例的C ++中的norm()函数
  8. 现在学python有前途吗-Python为什么这么牛?转行学Python有发展前景吗?
  9. ubuntu系统修改系统时间
  10. 大专计算机毕业当兵有前途吗,24岁的大专毕业生去当兵有前途吗?该怎么办?...