一、建造者模式定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
说明:建造模式是一种对象创建型模式,它将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。
二、建造者模式结构
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)如果产品复杂,且对象较多,则系统会变的庞大。