您的位置:首页 > 编程语言 > C#

C#设计模式—建造者模式

2016-06-10 21:39 375 查看
一、建造者模式定义

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

    说明:建造模式是一种对象创建型模式,它将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。

二、建造者模式结构

    1)抽象建造者:为创建一个产品对象的各个部件指定抽象接口,该接口中一般包含两个方法:一个是创建复杂对象的各个部分;另一个是GetResult()方法,用于返回复杂对象。

    2)具体建造者:它实现了Builder接口,实现各个部件的具体构造和装配方法。

    3)产品:它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义产品的装配过程。

    4)指挥者:指挥类,安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实现实例化具体建造者对象,然后通过指挥类的构造函数或Setter方法将该对象传入指挥者类中。

三、应用实例

    游戏软件公司开发一款基于角色扮演的多人在线网络游戏,玩家可以再游戏中扮演虚拟世界中的特定角色,角色根据不同的游戏情节和统计数据(例如:力量,魔法,技能等)具有不同的能力,角色也会随着不断升级而拥有更加强大的能力。

    应用实例代码实现:http://download.csdn.net/detail/qq_30507287/9545930

    ActorController充当指挥者;ActorBuilder抽象建造者;HeroBuilder、AngelBuilder和DevilBuilder是具体建造者;Actor为客户端需要的复杂产品。

复杂产品:

    //游戏中角色类,充当复杂产品对象
    classActor
    {
        privatestringtype;//角色类型
        privatestringsex;//性别
        privatestringface;//面容
        privatestringcostume;//服装
        privatestringhairstyle;//发型
 
        publicstringType
        {
            get{
return type; }
            set{ type =
value; }
        }
        publicstringSex
        {
            get{
return sex; }
            set{ sex =
value; }
        }
        publicstringFace
        {
            get{
return face; }
            set{ face =
value; }
        }
        publicstringCostume
        {
            get{
return costume; }
            set{ costume =
value; }
        }
        publicstringHairstyle
        {
            get{
return hairstyle; }
            set{ hairstyle =
value; }
        }
    }

ActorBuilder.cs抽象建造者

    //角色建造者:抽象建造者
    abstractclassActorBuilder
    {
        protectedActor actor =new
Actor();
 
        publicabstractvoidBuildType();
        publicabstractvoidBuildSex();
        publicabstractvoidBuildFace();
        publicabstractvoidBuildCostum();
        publicabstractvoidBuildHairstyle();
 
        //工厂方法、返回一个完整的游戏角色对象
        publicActor CreateActor()
        {
            returnactor;
        }
}

具体建造者:

1)英雄角色建造者

    //英雄角色建造者,为具体建造者
    classHeroBuilder:ActorBuilder
    {
        publicoverridevoidBuildType()
        {
           actor.Type = "英雄";
        }
        publicoverridevoidBuildSex()
        {
           actor.Sex = "男";
        }
        publicoverridevoidBuildFace()
        {
           actor.Face = "英俊";
        }
        publicoverridevoidBuildCostume()
        {
           actor.Costume = "盔甲";
        }
        publicoverridevoidBuildHairstyle()
        {
           actor.Hairstyle = "飘逸";
        }
}

2)具体建造者:天使角色建造者

    //具体建造者:天使角色
    classAngelBuilder:ActorBuilder
    {
        publicoverridevoidBuildType()
        {
           actor.Type = "天使";
        }
        publicoverridevoidBuildSex()
        {
           actor.Sex = "女";
        }
        publicoverridevoidBuildFace()
        {
           actor.Face = "漂亮";
        }
        publicoverridevoidBuildCostume()
        {
           actor.Costume = "白裙";
        }
        publicoverridevoidBuildHairstyle()
        {
           actor.Hairstyle = "披肩长发";
        }
}

3)具体建造者:恶魔角色建造者

    //具体建造者:恶魔角色
    classDevilBuilder:ActorBuilder
    {
        publicoverridevoidBuildType()
        {
           actor.Type = "恶魔";
        }
        publicoverridevoidBuildSex()
        {
           actor.Sex = "妖";
        }
        publicoverridevoidBuildFace()
        {
           actor.Face = "丑陋";
        }
        publicoverridevoidBuildCostume()
        {
           actor.Costume = "黑衣";
        }
        publicoverridevoidBuildHairstyle()
        {
           actor.Hairstyle = "光头";
        }
}

角色控制者:

    //角色控制者:指挥者
    classActorController
    {
        //逐步构建复杂产品对象
        publicActor Construct(ActorBuilder ab)
        {
            Actor actor;
           ab.BuildType();
           ab.BuildSex();
           ab.BuildFace();
           ab.BuildCostume();
           ab.BuildHairstyle();
            actor = ab.CreateActor();
            returnactor;
        }
}

配置文件:App.config的设置(可以设置所需创建的对象)

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
    <startup>
        <supportedRuntimeversion="v4.0"sku=".NETFramework,Version=v4.5.2,Profile=Client"/>
    </startup>
  <appSettings>
    <addkey="builder"value="BuilderSample.AngelBuilder"/>
  </appSettings>
</configuration>

客户端测试类:

    classProgram
    {
        staticvoidMain(string[] args)
        {
            //抽象建造者对象
            ActorBuilder ab;
            //读取配置文件,获取要创建的角色的类型
            stringbuilderType =
ConfigurationManager.AppSettings["builder"];
            //反射生成对象
           ab = (ActorBuilder)Assembly.Load("BuilderSample").CreateInstance(builderType);
            ActorController ac =new
ActorController();
            Actor actor;
            //指挥者创建完整的建造对象
           actor = ac.Construct(ab);
 
            Console.WriteLine("{0}的外观",actor.Type);
            Console.WriteLine("性别{0}",actor.Sex);
            Console.WriteLine("面容{0}",actor.Face);
            Console.WriteLine("服装{0}",actor.Costume);
            Console.WriteLine("发型{0}",actor.Hairstyle);
            Console.Read();
        }
    }

四、建造者的优点

    1)客户端不必知道产品的内部结构;

    2)每一个建造者相对比较独立,便于增加建造者对象;

    3)用户可以控制创建过程。

五、建造者模式的确定

    1)产品具有较多的共同点,组成部分相似,如果对象之间差异较大就不适合该模式;

    2)如果产品复杂,且对象较多,则系统会变的庞大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: