C++ 设计模式——简单工厂模式

简单工厂模式

简单工厂模式是一种创建型设计模式,通过一个工厂类来负责对象的实例。这种模式将对象创建的细节封装在工厂类中,客户端无需知道具体的创建过程,只需通过工厂类获取对象实例即可。

引入“简单工厂”设计模式的定义(实现意图):定义一个工厂类,该类的成员函数可以根据不同的参数创建并返回不同的类对象,被创建的对象所属的类一般都具有相同的父类。调用者无需关心创建对象的细节。

主要组成部分
  • 工厂类(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_lifem_magicm_attack)。
    • M_UndeadM_ElementM_Mechanic 类继承自 Monster,实现不同类型的怪物。
  • 工厂类
    • MonsterFactory 类负责创建怪物实例,提供 createMonster 方法,根据参数返回不同类型的怪物对象。
类与方法
  1. 产品类
    • Monster(抽象类)
      • 属性:
        • # m_life:生命值,使用 # 表示为保护属性,子类可以访问。
        • # m_magic:魔法值,使用 # 表示为保护属性。
        • # m_attack:攻击力,使用 # 表示为保护属性。
      • 方法:
        • + Monster():构造函数,公开方法。
        • - ~Monster():析构函数,私有方法。
    • M_UndeadM_ElementM_Mechanic(具体类)
      • 方法:
        • + M_Undead():构造函数
        • + M_Element():构造函数
        • + M_Mechanic():构造函数
  2. 工厂类MonsterFactory
    • 方法:
      • + createMonster(string strmontype):公开方法,根据字符串参数创建不同类型的怪物对象
优点和缺点
  • 优点

    • 简化客户端代码,不需要直接实例化复杂对象。
    • 提供一个集中管理对象创建的单一入口。
  • 缺点

    • 增加新的产品时,需要修改工厂的代码,违反了开闭原则。
    • 如果产品种类过多,工厂类可能会变得臃肿。
适用场景
  • 需要创建的对象具有相似的结构或特性,且种类较少时。
  • 客户端不关心对象创建过程,只需获得对象实例时。
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值