如果你也喜欢C#开发或者.NET开发,可以关注我,我会一直更新相关内容,并且会是超级详细的教程,只要你有耐心,基本上不会有什么问题,如果有不懂的,也可以私信我加我联系方式,我将毫无保留的将我的经验和技术分享给你,不为其他,只为有更多的人进度代码的世界,而进入代码的世界,最快捷和最容易的就是C#.NET,准备好了,就随我加入代码的世界吧!
实例资源已上传
查看资源
一、建造者模式简介
建造者模式是一种创建型设计模式,用于生成复杂对象。它通过将对象的构建过程拆分为多个独立的步骤,使得构建过程灵活可变,同时能够保持相同的构建过程生成不同的表示。
在建造者模式中,有以下几个角色:
-
产品(Product):表示被构建的复杂对象。通常包含多个部分或组件。
-
抽象建造者(Builder):定义构建产品的抽象接口,包含创建和组装产品的方法。
-
具体建造者(Concrete Builder):具体实现抽象建造者接口,实现产品的构建步骤,并返回最终构建的产品。
-
指挥者(Director):负责安排具体建造者的构建步骤,控制产品的构建流程。
使用建造者模式的好处是可以将构建过程与产品分离,使得同样的构建过程可以创建不同的产品。它也可以隐藏产品的构建细节,使得使用者只需要与抽象接口进行交互,而不需要关注具体的构建细节。
建造者模式常用于创建复杂的对象,特别是当对象的构建过程较为复杂,而且需要多个步骤或组件参与的情况下。通过使用建造者模式,可以使得构建过程更加灵活、可扩展和可维护。
二、为什么要学习建造者模式:
2.1 简化复杂对象的创建过程
建造者模式通过将复杂对象的构建过程分解为多个简单的步骤,使得对象的创建过程更加清晰和可控。通过将复杂对象的构建逻辑封装在具体的建造者类中,可以将构建过程独立于主要业务逻辑,从而提高代码的可读性和可维护性。
2.2 提供灵活的对象构建方式
建造者模式可以通过不同的具体建造者类来构建不同的产品对象,从而实现灵活的对象构建方式。通过切换具体建造者类,可以构建出不同的产品对象,而且可以通过一个统一的构建者接口来操作不同的具体建造者类,从而提高代码的扩展性和灵活性。
2.3 支持构建过程的逐步完善
建造者模式支持构建过程的逐步完善,即通过设置不同的建造者方法来逐步完善产品对象的构建过程。这种逐步完善的方式可以帮助开发人员更好地理解复杂对象的构建过程,并且可以根据实际需求来动态地调整构建过程,从而更好地满足用户的需求。
2.4 分离产品的构建和表示
建造者模式将产品的构建和表示分离开来,即通过建造者类来构建产品对象,而通过产品类来表示产品的属性和功能。这种分离可以使得产品类的设计更加简洁,同时也可以使得同样的构建过程可以创建出不同的产品表示形式,提高代码的复用性。
2.5 降低客户端与产品类的耦合度
通过建造者模式,客户端可以通过调用具体建造者类来构建产品对象,而不需要直接依赖于具体产品类。这种降低客户端与产品类的耦合度的方式,可以使得客户端在不同的产品构建过程中可以使用相同的构建者接口,从而减少客户端的变动,提高代码的稳定性和可维护性。
三、建造者模式在项目中有哪些实际应用:
3.1 游戏开发
在游戏开发中,通常需要创建具有复杂结构的游戏角色或道具。使用建造者模式可以将创建过程分离出来,让开发人员更加灵活地组合和构建游戏对象。
3.2 UI设计工具
UI设计工具通常需要支持创建各种复杂的用户界面元素,如按钮、文本框、下拉框等。使用建造者模式可以将创建过程封装起来,简化创建界面元素的操作。
3.3 汽车制造业
在汽车制造业中,汽车的制造过程通常需要多个步骤,并且不同的汽车型号有不同的配置选项。使用建造者模式可以将制造过程分解为多个步骤,并且可以根据需要选择不同的配置选项来构建汽车。
3.4 文章编辑器
文章编辑器通常需要支持创建包含不同类型的内容(如文字、图片、视频等)的文章。使用建造者模式可以将创建不同类型内容的过程封装起来,使得编辑器可以根据需要进行灵活的内容组合和构建。
3.5 电商平台
在电商平台中,通常需要创建包含不同商品、价格、颜色等属性的商品列表。使用建造者模式可以将创建商品列表的过程封装起来,使得电商平台可以根据需要构建不同属性的商品列表。
四、建造者模式举例实现:
4.1 项目背景
西游各大佬觉得安排一组取经人去西天取经,在西天灵山的会议中,一致决定:由太上老君、玉皇大帝、王母娘娘和如来佛祖,各打造一个取经人,要求取经人拥有武器等属性,最后由观音管理取经人,使用建造者模式进行实现:
4.1.1 创建产品:取经人
/// <summary>
/// 定义复杂产品对象:取经人
/// </summary>
public class SutraSeek
{
/// <summary>
/// 取经人类型
/// </summary>
private string type;
/// <summary>
/// 取经人名称
/// </summary>
private string name;
/// <summary>
/// 取经人性别
/// </summary>
private string sex;
/// <summary>
/// 取经人使用的兵器
/// </summary>
private string arms;
/// <summary>
/// 取经人的发型
/// </summary>
private string hairstyle;
public string Type { get => type; set => type = value; }
public string Name { get => name; set => name = value; }
public string Sex { get => sex; set => sex = value; }
public string Arms { get => arms; set => arms = value; }
public string Hairstyle { get => hairstyle; set => hairstyle = value; }
}
4.1.2 创建抽象建造者西天灵山
/// <summary>
/// 抽象建造者西天灵山:取经人建造者
/// </summary>
public abstract class LingShanBuilder
{
//创建一个取经人对象
protected SutraSeek sutraSeek = new SutraSeek();
//创建取经人类型
public abstract void BuildType();
//创建取经人名称
public abstract void BuildName();
//创建取经人性别
public abstract void BuildSex();
//创建取经人兵器
public abstract void BuildArms();
//创建取经人的发型
public abstract void BuildHairstyle();
/// <summary>
/// 工厂方法,返回一个完整的取经人
/// </summary>
/// <returns></returns>
public SutraSeek CreateSutraSeek() {
return sutraSeek;
}
}
4.1.3 创建具体建造者:老君、玉帝、王母和如来
1.老君创建带中分发型的孙悟空
/// <summary>
/// 具体建造者:老君创建孙悟空
/// </summary>
public class LaoJun : LingShanBuilder
{
/// <summary>
/// 实现抽象建造者的建造方法:给取经人兵器
/// </summary>
public override void BuildArms()
{
sutraSeek.Arms = "如意金箍棒";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人发型
/// </summary>
public override void BuildHairstyle()
{
sutraSeek.Hairstyle = "中分";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人名称
/// </summary>
public override void BuildName()
{
sutraSeek.Name = "孙悟空";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人性别
/// </summary>
public override void BuildSex()
{
sutraSeek.Sex = "男";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人身份
/// </summary>
public override void BuildType()
{
sutraSeek.Type = "老大";
}
}
2.玉帝创建带脏辫的猪悟能
/// <summary>
/// 具体建造者:玉帝创建猪悟能
/// </summary>
public class JadeEmperor : LingShanBuilder
{
/// <summary>
/// 实现抽象建造者的建造方法:给取经人兵器
/// </summary>
public override void BuildArms()
{
sutraSeek.Arms = "九齿钉耙";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人发型
/// </summary>
public override void BuildHairstyle()
{
sutraSeek.Hairstyle = "脏辫";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人名称
/// </summary>
public override void BuildName()
{
sutraSeek.Name = "猪悟能";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人性别
/// </summary>
public override void BuildSex()
{
sutraSeek.Sex = "男";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人身份
/// </summary>
public override void BuildType()
{
sutraSeek.Type = "老二";
}
}
3.王母创建地中海发型的沙悟净
/// <summary>
/// 具体建造者:王母创建沙悟能
/// </summary>
public class QueenMother : LingShanBuilder
{
/// <summary>
/// 实现抽象建造者的建造方法:给取经人兵器
/// </summary>
public override void BuildArms()
{
sutraSeek.Arms = "降妖宝杖";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人发型
/// </summary>
public override void BuildHairstyle()
{
sutraSeek.Hairstyle = "地中海";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人名称
/// </summary>
public override void BuildName()
{
sutraSeek.Name = "沙悟净";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人性别
/// </summary>
public override void BuildSex()
{
sutraSeek.Sex = "男";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人身份
/// </summary>
public override void BuildType()
{
sutraSeek.Type = "老三";
}
}
4.如来创建光头的唐三藏
/// <summary>
/// 具体建造者:如来创建唐三藏
/// </summary>
public class Bodhisattva : LingShanBuilder
{
/// <summary>
/// 实现抽象建造者的建造方法:给取经人兵器
/// </summary>
public override void BuildArms()
{
sutraSeek.Arms = "九环锡杖";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人发型
/// </summary>
public override void BuildHairstyle()
{
sutraSeek.Hairstyle = "光头";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人名称
/// </summary>
public override void BuildName()
{
sutraSeek.Name = "唐三藏";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人性别
/// </summary>
public override void BuildSex()
{
sutraSeek.Sex = "男";
}
/// <summary>
/// 实现抽象建造者的建造方法:给取经人身份
/// </summary>
public override void BuildType()
{
sutraSeek.Type = "师父";
}
}
4.1.4 创建指挥者:观音菩萨
/// <summary>
/// 指挥者:观音
/// </summary>
public class GuanYin
{
/// <summary>
/// 逐步构建复杂产品对象:取经人
/// </summary>
/// <param name="lingShan"></param>
/// <returns></returns>
public SutraSeek Construct(LingShanBuilder lingShan)
{
SutraSeek sutraSeek;
lingShan.BuildArms();
lingShan.BuildName();
lingShan.BuildSex();
lingShan.BuildHairstyle();
lingShan.BuildType();
sutraSeek = lingShan.CreateSutraSeek();
return sutraSeek;
}
}
4.2 详细实现
static void Main(string[] args)
{
//针对抽象建造者(灵山)编程
LingShanBuilder lingShan;
lingShan = new Bodhisattva();
GuanYin guanYin = new GuanYin();
SutraSeek sutraSeek;
sutraSeek = guanYin.Construct(lingShan);
Console.WriteLine($"取经人:{sutraSeek.Name}\n兵器:{sutraSeek.Arms}\n性别:{sutraSeek.Sex}\n发型:{sutraSeek.Hairstyle}\n身份:{sutraSeek.Type}");
Console.ReadKey();
}
运行一下:
现在观音已经把唐三藏安排进取经团队了,想要安排孙悟空,怎么处理?
修改Main函数中的代码:
static void Main(string[] args)
{
//针对抽象建造者(灵山)编程
LingShanBuilder lingShan;
lingShan = new LaoJun();
GuanYin guanYin = new GuanYin();
SutraSeek sutraSeek;
sutraSeek = guanYin.Construct(lingShan);
Console.WriteLine($"取经人:{sutraSeek.Name}\n兵器:{sutraSeek.Arms}\n性别:{sutraSeek.Sex}\n发型:{sutraSeek.Hairstyle}\n身份:{sutraSeek.Type}");
Console.ReadKey();
}
运行结果:
五、建造者模式的优缺点:
5.1 建造者模式的优点
5.1.1 可以隐藏产品的创建细节,使客户端无需关心具体的创建过程。
5.1.2 可以灵活地组合对象的创建步骤,实现不同的组合,从而创建不同的产品。
5.1.3 可以重用相同的创建过程来创建不同的产品对象。
5.1.4 可以更好地控制产品对象的创建过程,对于复杂的创建逻辑,可以将其分解成多个简单的步骤。
5.2 建造者模式的缺点
5.2.1 需要定义多个具体的建造者类,增加了系统的复杂性。
5.2.2 如果产品的属性过多,需要创建多个参数列表,构造方法会变得很长,增加了使用的难度。
5.2.3 建造者模式适用于产品对象的创建过程稳定的情况,如果产品的属性经常发生变化,需要频繁修改建造者类,不太适合使用建造者模式。
六、建造者模式需要注意的地方
6.1 确定需要创建的复杂对象的组成部分,并为每个部分创建相应的建造者类。
6.2 定义一个指导者类(Director),负责协调建造者类之间的调用顺序。指导者类可以使用建造者类来构建复杂对象。
6.3 建造者模式中的产品类通常需要具备一定的稳定性,即不会经常发生变化。如果产品类经常发生变化,那么建造者模式可能不适用。
6.4 将构建对象的过程封装在建造者类中,可以隐藏构建细节,简化客户端的使用。
6.5 如果创建的复杂对象过于庞大,可以考虑使用原型模式来生成对象的部分实例,然后在建造者模式中进行组装。
6.6 建造者模式中的建造者类可以有多种实现方式,可以根据实际情况选择不同的实现方式。
6.7 建造者模式可以与其他设计模式结合使用,例如工厂方法模式、抽象工厂模式等。
6.8 建造者模式适用于构建复杂对象,如果对象比较简单,可以直接使用其他创建型设计模式,如工厂方法模式。