建造者模式(Builder Pattern)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/393 访问。

建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。

角色:

1、抽象建造者(Builder)

给出一个抽象结论,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建;

2、具体建造者(Concrete Builder)

实现建造者接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在构造过程完成后,提供产品的实例;

3、指导者(Director)

调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;

4、产品类(Product)

需要创建的具体的复杂对象。

示例:

命名空间BuilderPattern中包含Vehicle机动车类充当产品类,Builder基类为抽象建造者,东风悦达Yuedakia类、大众汽车Volkswagen类、特斯拉Tesla类。另外包含1个机动车扩展类和1个指导者。本示例向大家演示3个不同的汽车厂商在生产比较复杂的汽车时所采用的策略。

namespace BuilderPattern
public abstract class Builder {

    protected Vehicle _product = new Vehicle();

    public abstract void BuildCarframe();

    public abstract void BuildWheel();

    public abstract void BuildDoor();

    public abstract void BuildApparatus();

    public abstract void BuildColor();

    public virtual Vehicle GetResult() {
return _product;
} }

建造者基类Builder,定义生产不同汽车部位的接口并在内部维持对机动车的引用。

public class Tesla : Builder {

    public override void BuildCarframe() {
_product.Carframe = "ZZ32093M3485C1356";
} public override void BuildWheel() {
_product.Wheel = 4;
} public override void BuildDoor() {
_product.Door = 5;
} public override void BuildApparatus() {
_product.Apparatus = "Model X";
} public override void BuildColor() {
_product.Color = Color.Red;
} }

具体建造者特斯拉Tesla类,实现抽象建造者Builder的接口。

public class Volkswagen : Builder {

    public override void BuildCarframe() {
_product.Carframe = "VS89362P1903C9852";
} public override void BuildWheel() {
_product.Wheel = 4;
} public override void BuildDoor() {
_product.Door = 4;
} public override void BuildApparatus() {
_product.Apparatus = "Skoda";
} public override void BuildColor() {
_product.Color = Color.Blue;
} }

具体建造者大众汽车Volkswagen类,实现抽象建造者Builder的接口。

public class Yuedakia : Builder {

    public override void BuildCarframe() {
_product.Carframe = "YK9391J0231L30D32";
} public override void BuildWheel() {
_product.Wheel = 4;
} public override void BuildDoor() {
_product.Door = 4;
} public override void BuildApparatus() {
_product.Apparatus = "Kia K3";
} public override void BuildColor() {
_product.Color = Color.Wheat;
} }

具体建造者东风悦达Yuedakia类,实现抽象建造者Builder的接口。

public class Vehicle {

    public string Carframe { get; set; }

    public int Wheel { get; set; }

    public int Door { get; set; }

    public string Apparatus { get; set; }

    public Color Color { get; set; }

    public void Print() {
Console.WriteLine($"{this.VehicleInfo()}");
} }

机动车Vehicle类,这是我们通过建造者模式所要创建的复杂对象。

public class Director {

    public void Construct(Builder builder) {
builder.BuildCarframe();
builder.BuildWheel();
builder.BuildDoor();
builder.BuildApparatus();
builder.BuildColor();
} }

这是指导类Director,它负责对象的创建过程。

public static class Extentions {

    public static string VehicleInfo(this Vehicle vehicle) {
var type = vehicle.GetType();
var properties = type.GetProperties();
var result = string.Empty;
foreach (var prop in properties) {
result +=
$"{prop.Name}:{prop.GetValue(vehicle, null)}{Environment.NewLine}";
}
return result;
} }

一个扩展类,方便演示过程中打印出相关信息。

public class Program {

    private static Director _director = null;

    private static List<Builder> _builders = null;

    private static Vehicle _vehicle = null;

    public static void Main(string[] args) {
_director = new Director();
_vehicle = new Vehicle(); _builders = new List<Builder>() {
new Tesla(),
new Volkswagen(),
new Yuedakia()
}; foreach (var builder in _builders) {
_director.Construct(builder);
_vehicle = builder.GetResult();
_vehicle.Print();
} Console.ReadKey();
} }

以上是调用方的代码,分别维持对指导者、建造者和机动车的引用,接下来我们创建了3辆汽车,特斯拉的Model X、大众汽车的Skoda和东风悦达的Kia K3。以下是这个案例的输出结果:

Carframe:ZZ32093M3485C1356
Wheel:4
Door:5
Apparatus:Model X
Color:Color [Red] Carframe:VS89362P1903C9852
Wheel:4
Door:4
Apparatus:Skoda
Color:Color [Blue] Carframe:YK9391J0231L30D32
Wheel:4
Door:4
Apparatus:Kia K3
Color:Color [Wheat]

优点:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/393 访问。

1、易于解耦,将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品;

2、易于精确控制对象的创建,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰;

3、易于拓展,增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则”。

缺点:

1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;

2、如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制;

3、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

使用场景:

1、需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

2、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

最新文章

  1. GruntJS常用前端流程自动化配置-【持续优化】
  2. php ajax 交互
  3. 在自定义TableViewCell类里面添加按钮事件触发不了的一些实践
  4. DWZ错误的解决:0x800a13af - Microsoft JScript 运行时错误: 重新声明常量“document”
  5. MMORPG大型游戏设计与开发(客户端架构 part11 of vegine)
  6. openssl知识点总结
  7. Markdown 语法速查表
  8. 查看SDCard是否被挂载
  9. LCA问题的ST,tarjan离线算法解法
  10. poj 1265 Area(Pick定理)
  11. 浅谈 js 正则字面量 与 new RegExp 执行效率
  12. 转每天一个linux命令(2):cd命令
  13. 【Java入门提高篇】Day25 史上最详细的HashMap红黑树解析
  14. linux 消息队列
  15. [CentOS_7.4]Linux编译安装ffmpeg
  16. 两层c:forEach循环嵌套
  17. Spark共享变量(广播变量、累加器)
  18. 原生js实现一个简单的轮播图
  19. github或码云协同开发
  20. LeetCode Top100 Liked Questions

热门文章

  1. vuex : 模块化改造
  2. centos7中防火墙转为iptables
  3. Android Studio(Kotlin)之RecyclerView
  4. 【Redis学习专题】- Redis主从+哨兵集群部署
  5. 一起学Blazor WebAssembly 开发(2)
  6. nginx 日志功能详解
  7. java 如何正确的输出集合或者对象的值
  8. Mysql5.7前后修改用户密码变化
  9. Go的安装和使用
  10. 干货分享丨玩转物联网IoTDA服务系列四-智能网关