简单工厂模式
- 简单工厂模式
- 主要组成部分
- 代码实现
- 简单工厂模式模式的 UML 图
- UML图解析
- 类与方法
- 优点和缺点
- 适用场景
简单工厂模式
简单工厂模式是一种创建型设计模式,通过一个工厂类来负责对象的实例。这种模式将对象创建的细节封装在工厂类中,客户端无需知道具体的创建过程,只需通过工厂类获取对象实例即可。
引入“简单工厂”设计模式的定义(实现意图):定义一个工厂类,该类的成员函数可以根据不同的参数创建并返回不同的类对象,被创建的对象所属的类一般都具有相同的父类。调用者无需关心创建对象的细节。
主要组成部分
- 工厂类(Factory):负责创建对象的类。它包含一个静态方法,根据传入的参数决定创建哪种具体产品。
- 产品接口(Product):定义了产品的基本行为和属性,所有具体产品类都需要实现这个接口。
- 具体产品类(ConcreteProduct):实现了产品接口的具体类,表示工厂可以创建的具体对象。
代码实现
以下代码,主要用简单工厂模式创建不同类型的怪物对象:
#include <iostream>
#include <string>
using namespace std;
//怪物父类
class Monster
{
public:
//构造函数
Monster(int life, int magic, int attack) :m_life(life), m_magic(magic), m_attack(attack) {}
virtual ~Monster() {} //做父类时析构函数应该为虚函数
protected: //可能被子类访问的成员,用protected修饰
//怪物属性
int m_life; //生命值
int m_magic; //魔法值
int m_attack; //攻击力
};
//亡灵类怪物
class M_Undead :public Monster
{
public:
//构造函数
M_Undead(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一只亡灵类怪物来到了这个世界" << endl;
}
//其他代码略....
};
//元素类怪物
class M_Element :public Monster
{
public:
//构造函数
M_Element(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一只元素类怪物来到了这个世界" << endl;
}
//其他代码略....
};
//机械类怪物
class M_Mechanic :public Monster
{
public:
//构造函数
M_Mechanic(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一只机械类怪物来到了这个世界" << endl;
}
//其他代码略....
};
//--------------------------------
// 简单工厂模式
// 怪物工厂类
class MonsterFactory
{
public:
Monster* createMonster(string strmontype)
{
Monster* prtnobj = nullptr;
if (strmontype == "udd") //udd代表要创建亡灵类怪物
{
prtnobj = new M_Undead(300, 50, 80);
}
else if (strmontype == "elm") //ele代表要创建元素类怪物
{
prtnobj = new M_Element(200, 80, 100);
}
else if (strmontype == "mec") //mec代表要创建机械类怪物
{
prtnobj = new M_Mechanic(400, 0, 110);
}
return prtnobj;
}
};
// 使用示例
int main()
{
MonsterFactory facobj;
Monster* undead = facobj.createMonster("udd"); //产生了一只亡灵类怪物,当然这里必须知道"udd"代表的是创建亡灵类怪物
Monster* element = facobj.createMonster("elm"); //产生了一只元素类怪物
Monster* mechanic = facobj.createMonster("mec"); //产生了一只机械类怪物
// 释放内存
delete undead;
delete element;
delete mechanic;
return 0;
}
简单工厂模式模式的 UML 图
UML图解析
- 类关系:
- Monster 类为抽象基类,定义了怪物的基本属性(
m_life
、m_magic
、m_attack
)。 - M_Undead、M_Element、M_Mechanic 类继承自 Monster,实现不同类型的怪物。
- Monster 类为抽象基类,定义了怪物的基本属性(
- 工厂类:
- MonsterFactory 类负责创建怪物实例,提供
createMonster
方法,根据参数返回不同类型的怪物对象。
- MonsterFactory 类负责创建怪物实例,提供
类与方法
- 产品类:
Monster
(抽象类)- 属性:
# m_life
:生命值,使用#
表示为保护属性,子类可以访问。# m_magic
:魔法值,使用#
表示为保护属性。# m_attack
:攻击力,使用#
表示为保护属性。
- 方法:
+ Monster()
:构造函数,公开方法。- ~Monster()
:析构函数,私有方法。
- 属性:
M_Undead
、M_Element
、M_Mechanic
(具体类)- 方法:
+ M_Undead()
:构造函数+ M_Element()
:构造函数+ M_Mechanic()
:构造函数
- 方法:
- 工厂类
MonsterFactory
:- 方法:
+ createMonster(string strmontype)
:公开方法,根据字符串参数创建不同类型的怪物对象
- 方法:
优点和缺点
-
优点:
- 简化客户端代码,不需要直接实例化复杂对象。
- 提供一个集中管理对象创建的单一入口。
-
缺点:
- 增加新的产品时,需要修改工厂的代码,违反了开闭原则。
- 如果产品种类过多,工厂类可能会变得臃肿。
适用场景
- 需要创建的对象具有相似的结构或特性,且种类较少时。
- 客户端不关心对象创建过程,只需获得对象实例时。