当前位置: 首页 >  网技达人 >  设计模式(四)建造者

设计模式(四)建造者

导读:一、定义.讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种创建型模式。.二、描述.包含以下四个角色:.1、Builder(抽象建造者):.它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法:一类是Buil

一、定义

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

二、描述

包含以下四个角色:
1、Builder(抽象建造者): 它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法:一类是BuildPartX(),用于创建复杂对象的各个部件;另一类是GetResult(),用于返回生成好的复杂对象。Builder既可以是抽象类,也可以是接口。
2、ConcreteBuilder(具体建造者): 它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确其所创建的复杂对象,还可以提供一个方法返回创建好的复杂产品(该方法也可以由抽象建造者实现)。
3、Product(产品角色): 它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
4、Director(指挥者): 指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其Construct()方法中调用建造者对象的部件构造和装配方法,完成复杂对象的建造。客户端一般只需要和指挥者进行交互,在客户端确定具体建造者类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥类中。

三、例子

X公司要开发一款角色类游戏,角色根据不同情境具有不同能力,并且随着升级增强。角色是个复杂的对象,不同角色其性别、面容、服装、发型等都有所差异。无论何种角色,创建步骤都大同小异,都需要分步骤创建组成部分,再装配成一个完整的角色。
Actor:角色类复杂产品,实际业务较为复杂,示例简化只列出部分属性且类型为string

public class Actor
{
    //角色类型
    public string Type { get; set; }
    //性别
    public string Sex { get; set; }
    //面容
    public string Face { get; set; }
    //服装
    public string Costume { get; set; }
    //发型
    public string HairStyle { get; set; }
}

ActorBuilder:游戏角色建造器,充当抽象建造者

public abstract class ActorBuilder
{
    protected Actor actor = new Actor();

    public abstract void BuildType();
    public abstract void BuildSex();
    public abstract void BuildFace();
    public abstract void BuildCostume();
    public abstract void BuildHairStyle();

    // 工厂方法 : 返回一个完整的游戏角色对象
    public Actor CreateActor()
    {
        return actor;
    }
}

HeroBuilder、AngelBuilder和DevilBuilder:英雄角色、天使角色、魔鬼角色,充当具体建造者。

public class HeroBuilder : ActorBuilder
{
    public override void BuildType()
    {
        actor.Type = "英雄";
    }
    public override void BuildSex()
    {
        actor.Sex = "男";
    }
    public override void BuildFace()
    {
        actor.Face = "英俊";
    }
    public override void BuildCostume()
    {
        actor.Costume = "盔甲";
    }
    public override void BuildHairStyle()
    {
        actor.HairStyle = "飘逸";
    }
}
public class AngelBuilder : ActorBuilder
{
    public override void BuildType()
    {
        actor.Type = "天使";
    }
    public override void BuildSex()
    {
        actor.Sex = "女";
    }
    public override void BuildFace()
    {
        actor.Face = "漂亮";
    }
    public override void BuildCostume()
    {
        actor.Costume = "白裙";
    }
    public override void BuildHairStyle()
    {
        actor.HairStyle = "披肩长发";
    }
}
public class DevilBuilder : ActorBuilder
{
    public override void BuildType()
    {
        actor.Type = "恶魔";
    }
    public override void BuildSex()
    {
        actor.Sex = "妖";
    }
    public override void BuildFace()
    {
        actor.Face = "丑陋";
    }
    public override void BuildCostume()
    {
        actor.Costume = "黑衣";
    }
    public override void BuildHairStyle()
    {
        actor.HairStyle = "光头";
    }
}

ActorController:角色控制器,充当指挥者

public class ActorController
{
    public Actor Construct(ActorBuilder builder)
    {
        builder.BuildType();
        builder.BuildSex();
        builder.BuildFace();
        builder.BuildCostume();
        builder.BuildHairStyle();

        return builder.CreateActor(); ;
    }
}

Program:测试代码

ActorBuilder ab = new HeroBuilder();
ActorController ac = new ActorController();
Actor at = ac.Construct(ab);

Console.WriteLine(at.Type);
Console.WriteLine(at.Sex);
Console.WriteLine(at.Face);
Console.WriteLine(at.Costume);
Console.WriteLine(at.HairStyle);

Console.ReadLine();

四、总结

1、优点

(1)在建造者模式中,客户端不必知道产品内部的组成细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
(2)没一个具体建造者都相对独立,与其他的具体建造者无关,因此新增与替换具体建造者很方便,由于指挥者类针对抽象建造者编程,增加新的具体建造者无需修改原有类库的代码,系统扩展比较方便,符合开闭原则
(3)用户可以更加精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程

2、缺点

(1)建造者模式所创建产的品都具有一些较多的共同点,其组成部分相似,如果差异性很大,例如很多组成部分不同,那么则不适合使用建造者模式。
(2)如果产品的内部结构复杂多变,可能会需要定义很多具体构建者来实现这些变化,导致系统变得很庞大,增加了系统的理解难度和运行成本

内容
  • 最新消息,powershell,10多年的癌症被治好了!
    最新消息,powershell,
    2023-12-10
    问:癌症是指什么?.答:.powershell一直有个特性,它的管道会传递对象,请看:.‘abc’ | ForEach-
  • RocketMQ消费者是如何负载均衡的
    RocketMQ消费者是如何负载
    2023-12-09
    摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )
  • 2分钟快速上手流水线的创建与运行
    2分钟快速上手流水线的创建与运行
    2023-12-09
    摘要: 通过流水线新手体验模板,体验一条含代码检查、构建阶段、部署发布常用流水线的创建与执行。.本文分享自华为云社区《2
  • Three.js教程:对象克隆、复制
    Three.js教程:对象克隆、
    2023-12-08
    推荐:将 NSDT场景编辑器 加入你的3D工具链.其他系列工具: NSDT简石数字孪生.对象克隆.clone()和复制.
  • FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置
    FlashDuty Change
    2023-12-04
    FlashDuty:一站式告警响应平台,前往此地址免费体验!.FlashDuty.现在已经全面支持了深色模式,这为您提供
  • 女童裤子
    女童裤子
    2024-01-10
    女童裤子.产品介绍.我们的女童裤子是为年龄在3-12岁之间的女孩设计的。我们的裤子不仅样式多样,而且舒适耐穿,适合学校、
  • 儿童运动服
    儿童运动服
    2023-12-16
    儿童运动服.产品功能.我们的儿童运动服采用高品质的面料和工艺制作而成,具有出色的透气性和舒适性,可以让孩子在运动中保持干
  • 裙子
    裙子
    2023-12-16
    裙子.产品描述.我们的裙子采用高品质的面料制成,款式多样,适合各种场合穿着。无论是休闲的街头漫步,还是正式的商务会议,我
  • 短裤
    短裤
    2023-12-11
    时尚舒适,尽显运动魅力——短裤.产品功能.透气吸汗:采用透气材质制作,有效吸收汗液,让您在运动中保持干爽舒适。.伸缩自如
  • 风衣
    风衣
    2023-12-21
    风衣.产品功能.透气性高,能够有效排出体内热量和汗液,保持身体舒适.防风防水,能够有效阻挡外界风雨,保护身体不受天气影响
  • 儿童外套
    儿童外套
    2023-12-06
    儿童外套.产品功能.我们的儿童外套具有多种功能,包括保暖、防风、防水和舒适。它们采用高质量的面料制成,能够有效地抵御寒冷
  • 外套
    外套
    2023-12-06
    外套.外套是一种经典的服装单品,不仅给人温暖的保护,还可以提升整体的时尚感。我们的外套采用高品质的材料和工艺**而成,既
  • 儿童T恤
    儿童T恤
    2023-12-26
    儿童T恤.儿童T恤是一种专门为儿童设计的上衣,具有舒适、时尚、环保等特点,是孩子们*常穿着的必备单品。.产品功能.儿童T
  • 衬衫
    衬衫
    2023-12-31
    产品介绍:衬衫.产品功能.衬衫是一种适合各种场合穿着的服装,既可以正式地穿在工作场所,也可以搭配牛仔裤穿在休闲场合。.衬
  • 休闲鞋
    休闲鞋
    2024-01-05
    休闲鞋 - 轻松舒适的时尚选择.产品功能.休闲鞋 是一款适合各种活动的多功能鞋,其设计灵感来源于慢生活和自由精神。采用轻