一、实验内容
利用建造者模式实现游戏人物设定。 实例说明:某游戏软件中人物角色包括多种类型,不同类型的人物角色,其性别、脸型、发型等外部特征有所差异,使用建造者模式创建人物角色对象,要求绘制类图并编程实现。
二.设计类图
三、类具体代码(要求有相关注释)
#include<iostream>
#include<string>
using namespace std;
//角色类,这里只声明了角色的类型、性别、脸型和发型等属性
class Actor
{
private:
string m_Type;//类型
string m_Sex;//性别
string m_Face;//脸型
string m_Hairstyle;//发型
public:
void setType(string type)
{
m_Type = type;
}
void setSex(string sex)
{
m_Sex = sex;
}
void setFace(string face)
{
m_Face = face;
}
void setHairstyle(string hairstyle)
{
m_Hairstyle = hairstyle;
}
string getType()
{
return m_Type;
}
string getSex()
{
return m_Sex;
}
string getFace()
{
return m_Face;
}
string getHairStyle()
{
return m_Hairstyle;
}
};
//角色建造者
class ActorBuilder
{
protected:
Actor actor = Actor();
public:
virtual void buildType() = 0 {}
virtual void buildSex() = 0 {}
virtual void buildFace() = 0 {}
virtual void buildHairstyle() = 0 {}
//工厂方法,创建并返回一个完整的游戏角色对象
Actor createActor()
{
return actor;
}
};
//具体的建造者 : 英雄角色建造器
class HeroBuilder : public ActorBuilder
{
public:
void buildType()
{
actor.setType("英雄");
}
void buildSex()
{
actor.setSex("男");
}
void buildFace()
{
actor.setFace("英俊");
}
void buildHairstyle()
{
actor.setHairstyle("黑色短发");
}
};
//具体的建造者 : 天使角色建造器
class AngelBuilder : public ActorBuilder
{
public:
void buildType()
{
actor.setType("天使");
}
void buildSex()
{
actor.setSex("女");
}
void buildFace()
{
actor.setFace("美若天仙");
}
void buildHairstyle()
{
actor.setHairstyle("金色长发");
}
};
//具体的建造者 : 魔鬼角色建造器
class DevilBuilder : public ActorBuilder
{
public:
void buildType()
{
actor.setType("恶魔");
}
void buildSex()
{
actor.setSex("未知");
}
void buildFace()
{
actor.setFace("邪魅");
}
void buildHairstyle()
{
actor.setHairstyle("黑色长发");
}
};
//角色建造指挥者
class ActorController
{
public:
Actor construct(ActorBuilder* ab)
{
Actor actor;
ab->buildFace();
ab->buildHairstyle();
ab->buildSex();
ab->buildType();
actor = ab->createActor();
return actor;
}
};
int main()
{
ActorBuilder* ab;//针对抽象建造者编程
ab = new AngelBuilder();//生成具体的建造者
ActorController ac = ActorController();//创建一个新的指挥者
Actor actor;
//通过指挥者建造完整的建造者对象
actor = ac.construct(ab);
string type = actor.getType();
cout << type + "的外观:" << endl;
cout << "性别:" + actor.getSex() << endl;
cout << "面容:" + actor.getFace() << endl;
cout << "发型:" + actor.getHairStyle() << endl;
}
四.运行结果截图
五.设计模式分析总结
(一)、建造者模式的优点
1、在建造者模式中,客户端不必知道产品内部组成的构造细节,将产品本身与产品的构建解耦,使得相同的创建过程可以创建不同的产品对象。
2、每一个具体的建造者都相对独立,与其他的具体建造者无关,因此可以很方便的替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
3、可以更加精细的控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,是的创建过程更加清晰,也更方便使用程序来控制创建过程。
4、增加新的具体建造者无需修改原有的类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
(二)、建造者模式的缺点
1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似。如果产品间的差异性很大,则不适合使用建造者模式,因此其使用范围受到了一定的限制。
2、如果产品的内部变化复杂,可能会导致定义许多具体建造者类来实现这种变化,导致系统变得很大,类泛滥。
(三)、模式使用环境
1、需要生产的产品具有复杂的内部结构,这些产品对象通常包含多个成员属性。
2、需要生成的产品对象属性相互依赖,需要指定其生产顺序。
3、对象的创建过程独立于该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
4、隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。