/***
* @brief 创建型设计模式
*
* 1、简单工厂模式
* 2、工厂模式
*/
// 首先,我们来介绍简单工厂模式
// 简单工厂模式,并不算是一个真正的设计模式,而更像我们的一种编程习惯
// 但是在平时编码中这并不失为一个简单的方法,可以将客户程序从具体类中解耦
// 通过代码的方式来认识一下简单工厂模式
//
#include <iostream>
// 创建一个宏函数,增加代码可读性
#define _safe_delete_(ptr) \
if(ptr != nullptr) { delete ptr; ptr = nullptr; }
// 定义个枚举类型
typedef enum PRODUCTTYPE
{
PRODUCTTYPEA,
PRODUCTTYPEB,
}PType;
// 定义一个产品抽象类
class Product
{
public:
virtual ~Product() { }
// 定义一个纯虚函数,指定产品的具体作用
virtual void operation() = 0;
};
// 定义具体的产品类 - ProductA
class ProductA : public Product
{
public:
ProductA() { }
virtual ~ProductA() { }
virtual void operation() override final
{
std::cout << "Product A operation.\n";
}
private:
};
// 定义具体的产品类 - ProductB
class ProductB : public Product
{
public:
ProductB() { }
virtual ~ProductB() { }
virtual void operation() override final
{
std::cout << "Product B operation.\n";
}
private:
};
class Factory
{
public:
Product* create(const PType _ptype /* 接收传入的参数,通过参数来指定应该创建哪类产品 */ )
{
switch(_ptype)
{
case PRODUCTTYPEA: // 实例化A类产品
product = new ProductA();
break;
case PRODUCTTYPEB: // 实例化B类产品
product = new ProductB();
break;
default:
break;
}
return product;
}
private:
Product *product;
};
// 测试代码 -- 客户端程序
void test01()
{
// 创建工厂类
Factory* factory = new Factory();
// 生产产品
// 通过工厂类, 创建具体对象
// 此时,创建对象的过程对客户端是透明的
Product* productA = factory->create(PRODUCTTYPEA);
Product* productB = factory->create(PRODUCTTYPEB);
// 执行动作
productA->operation();
productB->operation();
// 对象释放
_safe_delete_(factory);
_safe_delete_(productA);
_safe_delete_(productB);
}
int main(void)
{
test01();
return 0;
}
/**
* 简单工厂模式
*
* 优点:简单粗暴。通过一个含参数的工厂方法,可以实例化任何产品类,上至飞机火箭、下至土豆面条.
*
* 缺点:
* 当所要生产的产品种类非常多的时候,工厂方法的代码量可能会很庞大。
* 同样,当要新增加一个产品类时候,需要对工厂方法进行重新修改,不符号 开闭原则
*
* 由此,我们引入了 工厂设计模式。
*
* 谢谢大家.
*/
设计模式-创建型-1-简单工厂模式
最新推荐文章于 2024-05-20 23:45:16 发布