一、工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
概念:
定义一个创建对象的接口,让子类自己选择需要实例化哪一个工厂类,创建实例的任务放到子类里去完成。这满足创建型模式中所要求的“创建与使用相分离”的特点。
二、简单工厂模式
简单工厂模式通常创建对象的方法为静态(static)的方法,所有也可以叫做静态工厂模式。它属于类创建型模式,它不在 GoF 23 种设计模式之列。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
三、简单工厂模式的优缺点
优点
简单工厂模式的优点
1)工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责
2)客户端无需知道所创建具体产品的类名,只需知道参数即可
3)也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
缺点
1)工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响
2)使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
3)系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
4)简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构
四、简单工厂的实现
1.怪物类
enum MonsterType
{
MONSTER_A,
MONSTER_B
};
//怪物基类
class CMonster
{
public:
CMonster();
~CMonster();
protected:
//怪物种类
MonsterType type;
};
2.派生类:怪物A
//怪物A继承怪物基类
class CMonster_A:public CMonster
{
public:
CMonster_A();
~CMonster_A();
};
3.派生类:怪物B
//怪物B继承怪物基类
class CMonster_B:public CMonster
{
public:
CMonster_B();
~CMonster_B();
};
4.怪物工厂
class CMonsterFactory
{
public:
CMonsterFactory();
~CMonsterFactory();
static CMonster* CreateMonster(const MonsterType& type);
private:
};
CMonster* CMonsterFactory::CreateMonster(const MonsterType& type)
{
CMonster* pMonster = nullptr;
switch (type)
{
case MONSTER_A:
pMonster = new CMonster_A;
break;
case MONSTER_B:
pMonster = new CMonster_B;
break;
case MONSTER_C:
pMonster = new CMonster_C;
break;
}
return pMonster;
}