登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
设计模式(四)建造者
设计模式(四)建造者
[ 复制链接 ]
驼娑
2025-6-9 00:13:13
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
一、定义
讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种创建型模式。
二、描述
包含以下四个角色:
1、Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法:一类是BuildPartX(),用于创建复杂对象的各个部件;另一类是GetResult(),用于返回生成好的复杂对象。Builder既可以是抽象类,也可以是接口。
2、ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确其所创建的复杂对象,还可以提供一个方法返回创建好的复杂产品(该方法也可以由抽象建造者实现)。
3、Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
4、Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其Construct()方法中调用建造者对象的部件构造和装配方法,完成复杂对象的建造。客户端一般只需要和指挥者进行交互,在客户端确定具体建造者类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥类中。
三、例子
X公司要开发一款角色类游戏,角色根据不同情境具有不同能力,并且随着升级增强。角色是个复杂的对象,不同角色其性别、面容、服装、发型等都有所差异。无论何种角色,创建步骤都大同小异,都需要分步骤创建组成部分,再装配成一个完整的角色。
Actor:角色类复杂产品,实际业务较为复杂,示例简化只列出部分属性且类型为string
public class Actor
{
//角色类型
public string Type { get; set; }
//性别
public string Sex { get; set; }
//面容
public string Face { get; set; }
//服装
public string Costume { get; set; }
//发型
public string HairStyle { get; set; }
}
复制代码
ActorBuilder:游戏角色建造器,充当抽象建造者
public abstract class ActorBuilder
{
protected Actor actor = new Actor();
public abstract void BuildType();
public abstract void BuildSex();
public abstract void BuildFace();
public abstract void BuildCostume();
public abstract void BuildHairStyle();
// 工厂方法 : 返回一个完整的游戏角色对象
public Actor CreateActor()
{
return actor;
}
}
复制代码
HeroBuilder、AngelBuilder和DevilBuilder:英雄角色、天使角色、魔鬼角色,充当具体建造者。
public class HeroBuilder : ActorBuilder
{
public override void BuildType()
{
actor.Type = "英雄";
}
public override void BuildSex()
{
actor.Sex = "男";
}
public override void BuildFace()
{
actor.Face = "英俊";
}
public override void BuildCostume()
{
actor.Costume = "盔甲";
}
public override void BuildHairStyle()
{
actor.HairStyle = "飘逸";
}
}
public class AngelBuilder : ActorBuilder
{
public override void BuildType()
{
actor.Type = "天使";
}
public override void BuildSex()
{
actor.Sex = "女";
}
public override void BuildFace()
{
actor.Face = "漂亮";
}
public override void BuildCostume()
{
actor.Costume = "白裙";
}
public override void BuildHairStyle()
{
actor.HairStyle = "披肩长发";
}
}
public class DevilBuilder : ActorBuilder
{
public override void BuildType()
{
actor.Type = "恶魔";
}
public override void BuildSex()
{
actor.Sex = "妖";
}
public override void BuildFace()
{
actor.Face = "丑陋";
}
public override void BuildCostume()
{
actor.Costume = "黑衣";
}
public override void BuildHairStyle()
{
actor.HairStyle = "光头";
}
}
复制代码
ActorController:角色控制器,充当指挥者
public class ActorController
{
public Actor Construct(ActorBuilder builder)
{
builder.BuildType();
builder.BuildSex();
builder.BuildFace();
builder.BuildCostume();
builder.BuildHairStyle();
return builder.CreateActor(); ;
}
}
复制代码
Program:测试代码
ActorBuilder ab = new HeroBuilder();
ActorController ac = new ActorController();
Actor at = ac.Construct(ab);
Console.WriteLine(at.Type);
Console.WriteLine(at.Sex);
Console.WriteLine(at.Face);
Console.WriteLine(at.Costume);
Console.WriteLine(at.HairStyle);
Console.ReadLine();
复制代码
四、总结
1、优点
(1)在建造者模式中,客户端不必知道产品内部的组成细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
(2)没一个具体建造者都相对独立,与其他的具体建造者无关,因此新增与替换具体建造者很方便,由于指挥者类针对抽象建造者编程,增加新的具体建造者无需修改原有类库的代码,系统扩展比较方便,符合开闭原则
(3)用户可以更加精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程
2、缺点
(1)建造者模式所创建产的品都具有一些较多的共同点,其组成部分相似,如果差异性很大,例如很多组成部分不同,那么则不适合使用建造者模式。
(2)如果产品的内部结构复杂多变,可能会需要定义很多具体构建者来实现这些变化,导致系统变得很庞大,增加了系统的理解难度和运行成本
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
设计模式
建造者
相关帖子
没听说过设计模式?保姆级教程来了!
设计模式之单例模式
Spring用到的10种设计模式,真巧妙!
设计模式-单例模式
设计模式-工厂模式
优化 if/else 的四种设计模式
设计模式之 Target/Action
软件设计模式系列之四——简单工厂模式
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
Go语言实现GoF设计模式:适配器模式
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
没听说过设计模式?保姆级教程来了!
3
501
涣爹卮
2025-07-09
安全
设计模式之单例模式
3
160
颖顿庐
2025-09-03
业界
Spring用到的10种设计模式,真巧妙!
1
318
崔和美
2025-09-24
业界
设计模式-单例模式
6
471
颖顿庐
2025-09-25
业界
设计模式-工厂模式
2
841
毡轩
2025-09-25
业界
优化 if/else 的四种设计模式
3
718
湄圳啸
2025-09-29
安全
设计模式之 Target/Action
8
600
甦忻愉
2025-09-30
安全
软件设计模式系列之四——简单工厂模式
3
1081
愆蟠唉
2025-10-10
安全
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
3
550
涂流如
2025-10-11
安全
Go语言实现GoF设计模式:适配器模式
4
487
柩通奉
2025-11-19
回复
(5)
东门芳洲
2025-10-25 00:47:37
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢分享,试用一下
汇干环
2025-10-31 03:43:57
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
收藏一下 不知道什么时候能用到
寇秀娟
2025-11-27 09:12:45
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
不错,里面软件多更新就更好了
杠氯
5 天前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
分享、互助 让互联网精神温暖你我
鞭氅
4 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢分享,辛苦了
鞣谘坡
13 小时前
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢,下载保存了
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
代码
签约作者
程序园优秀签约作者
发帖
驼娑
13 小时前
关注
0
粉丝关注
21
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845357
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9982
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
653
Oracle索引技术:理论与实操全解析
196
人工智能如何改变 Anthropic 的工作方式
616
IntelliJ IDEA 免费版正式发布,太香了!
716
Spring AI Alibaba 入门指南
495
延迟队列的实现范式——ZSet与Stream方案对
794
深入理解MyBatis缓存机制:一二级缓存全解
813
别买树莓派了!3步教你在安卓手机上跑通 CP
287
vue 甘特图 vxe-gantt table 依赖线的使用
605
你的代码正在腐烂:为什么我们都不敢碰那座
438
龙城宠医守护者联盟:2025年常州宠物健康卫
467
大语言模型~Ollama本地模型和java一起体验L
940
.Net通过EFCore和仓储模式实现统一数据权限
365
变天了!字节vs阿里大模型正面硬刚,双人视
758
C++学习笔记 23 宏 Macro
549
基于Python实现微信通知和预警
481
Java函数式接口——渐进式学习
784
Django QuerySet filter 完全指南:高效查
520
vue 甘特图 vxe-gantt table 任务条可拖拽
6
读捍卫隐私10读后总结与感想兼导读
968
【网页编写的编辑器对比】HBuilder / VS Co