建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
使用环境:当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。
接下来我们以moba类英雄开发的英雄开发为例进行分析,我们知道英雄都有一些基本属性:攻击力,防御力,血量等等,但是同时他们也有一些差别,有些英雄有法力值,而有些英雄没有;有些英雄有能量值,而有些英雄没有。我们这时候就可以使用建造者模式来构建英雄类。
class Hero
{
private:
int atk;//攻击力
int phylactic;//防御力
int blood;//血量
int blueadsorbed;//法力值
int energy;//能量
public:
int getatk()
{
return atk;
}
int getphylactic()
{
return phylactic;
}
int getblood()
{
return blood;
}
int getblueadsorbed()
{
return blueadsorbed;
}
int getenergy()
{
return energy;
}
void setatk(int x)
{
atk=x;
}
void setphylactic(int x)
{
phylactic=x;
}
void setblood(int x)
{
blood=x;
}void setblueadsorbed(int x)
{
blueadsorbed=x;
}
void setenergy(int x)
{
energy=x;
}
};
英雄可以分为有法力值,和有能量值2类(因为没有英雄可以同时拥有法力值和能量值),在英雄构建时,它们的属性不相同,考虑到扩展性,可以定义一个抽象英雄类,在该抽象类中定义了一系列创建具体英雄属性的方法。我们只定义2个英雄类,这2个英雄类继承于这个抽象英雄类。
//抽象英雄类:
class HeroPattern
{
private:
//具体英雄
Hero * m_hero;
public:
HeroPattern()
{
m_hero = new Hero();
}
~HeroPattern()
{
if( NULL != m_hero )
{
delete m_hero;
m_hero = nullptr;
}
}
}
//这里将设置属性函数设为virtual型,是为了保证所有的派生类对象的设置属性函数都会自动设置为virtual型,这保证了任何情况下,不会出现由于设置属性函数没有被调用而导致的内存泄漏。
virtual void setatk() = 0;
virtual void setphylactic() = 0;
virtual void setblood() = 0;
virtual void setblueadsorbed() = 0;
virtual void setenergy() = 0;
};
//有法力值的英雄
class hero1:public HeroPattern
{
void setatk()
{
m_hero->setatk(10);
}
void setphylactic()
{
m_hero->setphylacti(20);
}
void setblood()
{
m_hero->setblood(30);
}
void setblueadsorbed()
{
m_hero->setblueadsorbed(40);
}
void setenergy()
{
m_hero->setenergy(0);
}
};
//有能量值的英雄
class hero1:public HeroPattern
{
void setatk()
{
m_hero->setatk(10);
}
void setphylactic()
{
m_hero->setphylacti(20);
}
void setblood()
{
m_hero->setblood(30);
}
void setblueadsorbed()
{
m_hero->setblueadsorbed(0);
}
void setenergy()
{
m_hero->setenergy(40);
}
};
建造者模式的主要优点如下:
(1) 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
(2) 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。。
(3) 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,但是同样如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。
建造者模式在开发中大都用于:播放器界面的显示(如用户可以选择界面显示什么不显示什么);游戏人物的建模(如英雄人物都有一些相同的部分(身体,手,脚等等),但是每一个英雄的建造方法不同)等等。
以上内容纯粹属于个人理解,如果有错误,感谢大家的指正,谢谢!