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

来源:互联网 发布:编程培训班学费 编辑:程序博客网 时间:2024/06/10 01:03

一、建造者模式定义

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

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

二、建造者模式结构

    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 =newActor();

 

        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 =newActorController();

            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)如果产品复杂,且对象较多,则系统会变的庞大。

0 0
原创粉丝点击