创建型模式 - 建造者模式Builder
2024-10-21 11:54:07
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。
最近这个脑T---瘫----CSDN有毛病吧?我写这个都是涉及到广告了?谁家的广告? 谁给我钱了?审核策略设计者是什么NTR?
模式的定义与特点
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式的优点:
- 封装性好,构建和表示分离。
- 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
- 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
建造者模式的缺点:
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式(抽象工厂模式、简单工厂模式)更注重零部件的创建过程,但两者可以结合使用。
模式的结构与实现
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。
建造者(Builder)模式的主要角色如下。
- 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
- 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
//============================================================客户端代码
#region Builder
public static void BuilderTest1()
{
BuilderDirector director = new BuilderDirector();
director.Build(new BuilderWorker()).BuilderProductToString();
Console.WriteLine();
}
public static void BuilderTest2()
{
BuilderDirector1 director1 = new BuilderDirector1();
//按照客户制定的来
BuilderWorker1 worker1 = new BuilderWorker1();
worker1.BuildB("222BBB").BuildD("444DDD");
director1.Build(worker1).BuilderProductToString();
Console.WriteLine("=============分割线=============");
//默认顺序
BuilderWorker1 worker11 = new BuilderWorker1();
director1.Build(worker11).BuilderProductToString();
Console.WriteLine("=============分割线=============");
//自己 换一个建造者 接着打造该产品
worker1 = new BuilderWorker1(worker1.GetProduct());
worker1.BuildB("我又修改了");
director1.Build(worker1).BuilderProductToString();
}
#endregion
//============================================================建造者基类
namespace StudyDesignMode.Builder
{
//工作服务者基类,按步骤流程 有顺序的来
public abstract class Builder
{
public abstract void BuildA();
public abstract void BuildB();
public abstract void BuildC();
public abstract void BuildD();
public abstract BuilderProduct GetProduct();
}
//工作服务者基类,无序,按照客户要求来
public abstract class Builder1
{
public abstract Builder1 BuildA(string builderMsg);
public abstract Builder1 BuildB(string builderMsg);
public abstract Builder1 BuildC(string builderMsg);
public abstract Builder1 BuildD(string builderMsg);
public abstract BuilderProduct GetProduct();
}
}
//============================================================建造者类
namespace StudyDesignMode.Builder
{
//工作服务者
public class BuilderWorker : Builder
{
private BuilderProduct m_product;
public BuilderWorker() { m_product = new BuilderProduct(); }
public override void BuildA()
{
m_product.SetBuildA("Bulider_A");
Console.WriteLine("Bulider_A");
}
public override void BuildB()
{
m_product.SetBuildB("Bulider_B");
Console.WriteLine("Bulider_B");
}
public override void BuildC()
{
m_product.SetBuildC("Bulider_C");
Console.WriteLine("Bulider_C");
}
public override void BuildD()
{
m_product.SetBuildD("Bulider_D");
Console.WriteLine("Bulider_D");
}
public override BuilderProduct GetProduct(){ return m_product; }
}
public class BuilderWorker1 : Builder1
{
private BuilderProduct m_product;
public BuilderWorker1() { m_product = new BuilderProduct(); }
public BuilderWorker1(BuilderProduct product) { m_product = product; }
public override Builder1 BuildA(string builderMsg)
{
m_product.SetBuildA(builderMsg);
Console.WriteLine($"BuildA做出更改{builderMsg}");
return this;
}
public override Builder1 BuildB(string builderMsg)
{
m_product.SetBuildB(builderMsg);
Console.WriteLine($"BuildB做出更改{builderMsg}");
return this;
}
public override Builder1 BuildC(string builderMsg)
{
m_product.SetBuildC(builderMsg);
Console.WriteLine($"BuildC做出更改{builderMsg}");
return this;
}
public override Builder1 BuildD(string builderMsg)
{
m_product.SetBuildD(builderMsg);
Console.WriteLine($"BuildD做出更改{builderMsg}");
return this;
}
public override BuilderProduct GetProduct() { return m_product; }
}
}
//============================================================建造产品类
namespace StudyDesignMode.Builder
{
public class BuilderProduct
{
private string builderA = "ProductA";
private string builderB = "ProductB";
private string builderC = "ProductC";
private string builderD = "ProductD";
public string GetBuildA(string build){ return builderA; }
public void SetBuildA(string build){ builderA = build; }
public string GetBuildB(string build) { return builderB; }
public void SetBuildB(string build) { builderB = build; }
public string GetBuildC(string build) { return builderC; }
public void SetBuildC(string build) { builderC = build; }
public string GetBuildD(string build) { return builderD; }
public void SetBuildD(string build) { builderD = build; }
public void BuilderProductToString()
{
Console.WriteLine($"builderA = {builderA}");
Console.WriteLine($"builderB = {builderB}");
Console.WriteLine($"builderC = {builderC}");
Console.WriteLine($"builderD = {builderD}");
}
}
}
//============================================================指挥官类
namespace StudyDesignMode.Builder
{
//指挥官
public class BuilderDirector
{
public BuilderProduct Build(Builder builder)
{
builder.BuildA();
builder.BuildB();
builder.BuildC();
builder.BuildD();
return builder.GetProduct();
}
}
public class BuilderDirector1
{
public BuilderProduct Build(Builder1 builder)
{
return builder.GetProduct();
}
}
}
总结
用例子来说比较清楚明了:
假设我们目前有一个需求,有好多不同的工厂,其中的飞机场需要建造战斗机去战斗。
那我们需要通过抽象工厂模式或者工厂模式,编写不同的工厂,然后在其中的飞机工厂中获取飞机。那么飞机工厂只能提供已经组装好的飞机,那组装好的飞机从何而来? 这就需要我们通过建造者模式,去把战斗机的零件一个一个的生产出来,然后提供给飞机工厂。
希望大家:点赞,留言,关注咯~
唠家常
- Xiaohei.Wang(Wenhao)的今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我的QQ:841298494 (记得备注),大家一起进步
今日无推荐
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
- 小黑的杂货铺,想要什么都有,客官不进来喝杯茶么?
最新文章
- [LeetCode] Surrounded Regions 包围区域
- 详解Bootstrap按钮组件(二)
- Headfirst设计模式的C++实现——状态模式(State)
- Asp.Net分页存储过程
- maven安装和环境变量配置
- Google Android开发入门与实战
- 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类
- Makefile 管理工具 — Automake and Autoconf
- 在Linux下,在网络没有配置好前,怎样查看网卡的MAC地址?
- Lua高级教程Metatables
- jquery 日期获取
- java如何将html过滤为纯文本
- 每天学点SpringMVC-异常处理
- hdu 2047递推
- JQuery 获取select 的value值和文本值
- [转]【Angular4】基础(一):脚手架 Angular CLI
- Linux初学笔记---关于进程管理等
- ThreadLocal的使用场景及实现原理
- 使用MyEclipse建立working set
- 顺序表的C、C++实现
热门文章
- Golang Gorm time 时间字段格式化模型类 重写
- JavaWeb4
- 常用Python库整理
- PHP使用PHPmailer类和smtp发送邮件
- element ui 使用Tooltip 文字提示,文本内容中输入空格
- Chrome 103支持使用本地字体,纯前端导出PDF优化
- tomcat 随windows启动
- HSSFSheet XSSFWorkbook SXSSF Java读取Excel数据
- Python3.7.3安装TensorFlow和OpenCV3
- 成功解决pycharm 的setting中的Error occurred when installing package 'Keras'