【愚公系列】2021年12月 二十三种设计模式(三)-建造者模式(Builder Pattern)

简介: 【愚公系列】2021年12月 二十三种设计模式(三)-建造者模式(Builder Pattern)

文章目录

前言

一、建造者模式(Builder Pattern)

二、使用步骤

角色

示例

总结

优点

缺点

使用场景

前言

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。


提示:以下是本篇文章正文内容,下面案例可供参考


一、建造者模式(Builder Pattern)

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


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


二、使用步骤

角色

1、抽象建造者(Builder)


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


2、具体建造者(Concrete Builder)


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


3、指导者(Director)


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


4、产品类(Product)


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


示例

image.png

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

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]

总结

优点

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

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

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


缺点

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

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

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


使用场景

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

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


相关文章
|
3月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
1月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
61 0
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。