学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

最近这个脑T---瘫----CSDN有毛病吧?我写这个都是涉及到广告了?谁家的广告? 谁给我钱了?审核策略设计者是什么NTR

模式的定义与特点

建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

建造者模式的优点:

  1. 封装性好,构建和表示分离。
  2. 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
  3. 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。

建造者模式的缺点:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

        建造者(Builder)模式工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式(抽象工厂模式简单工厂模式)更注重零部件的创建过程,但两者可以结合使用。

模式的结构与实现

建造者(Builder)模式产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。

建造者(Builder)模式的主要角色如下。

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者(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 (记得备注),大家一起进步

今日无推荐

最新文章

  1. [LeetCode] Surrounded Regions 包围区域
  2. 详解Bootstrap按钮组件(二)
  3. Headfirst设计模式的C++实现——状态模式(State)
  4. Asp.Net分页存储过程
  5. maven安装和环境变量配置
  6. Google Android开发入门与实战
  7. 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类
  8. Makefile 管理工具 — Automake and Autoconf
  9. 在Linux下,在网络没有配置好前,怎样查看网卡的MAC地址?
  10. Lua高级教程Metatables
  11. jquery 日期获取
  12. java如何将html过滤为纯文本
  13. 每天学点SpringMVC-异常处理
  14. hdu 2047递推
  15. JQuery 获取select 的value值和文本值
  16. [转]【Angular4】基础(一):脚手架 Angular CLI
  17. Linux初学笔记---关于进程管理等
  18. ThreadLocal的使用场景及实现原理
  19. 使用MyEclipse建立working set
  20. 顺序表的C、C++实现

热门文章

  1. Golang Gorm time 时间字段格式化模型类 重写
  2. JavaWeb4
  3. 常用Python库整理
  4. PHP使用PHPmailer类和smtp发送邮件
  5. element ui 使用Tooltip 文字提示,文本内容中输入空格
  6. Chrome 103支持使用本地字体,纯前端导出PDF优化
  7. tomcat 随windows启动
  8. HSSFSheet XSSFWorkbook SXSSF Java读取Excel数据
  9. Python3.7.3安装TensorFlow和OpenCV3
  10. 成功解决pycharm 的setting中的Error occurred when installing package 'Keras'