常用设计模式之简单工厂模式
简单工厂模式 (C++)
工厂模式的使用场景也比较多,像是一些组件对象的创建场景,这里说一下简单工厂模式。
特点及应用
1. 特点
(1)封装具体实现,只提供管理对象接口
举个例子:我现在需要一个界面工厂,工厂只需要给我对应界面就可以,而我不需要去关心界面里面是怎样实现的,如何创建的。
(2)集中管理和控制
因为创建的产品不多,通常一个工厂类就行,这个工厂既可以负责同一类产品的创建,也可以是不同,实现对外创建对象的职责集中管理和控制。
(3)根据参数返回实例
你想返回得到一个什么样的对象实例,往往取决参数的选择,这个需要结合实际情况去选择。
2. 解决了什么问题
(1)通过简单工厂,实现调用类和具体实现类的解耦。(2) 帮助封装,面向接口编程。(3)集中管理。
3. 选择
(1)负责创建的对象比较少,业务逻辑不过于复杂。
写法介绍
结构组成
- 一个抽象父类产品,若干子类产品,一个工厂类(不是抽象类)。
具体实现
- 产品类
#ifndef PRODUCT_H
#define PRODUCT_H
#include <iostream>
enum ProductTypeItem
{
PRODUCT_ITEM_NONE,
PRODUCT_ITEM_APPLE,
PRODUCT_ITEM_BANANA,
PRODUCT_ITEM_NR
};
class productParent
{
public:
explicit productParent(ProductTypeItem type)
: mType(type)
{
std::cout << "I am [" << mType << "]!" << std::endl;
}
productParent(const productParent &) = delete;
productParent &operator=(const productParent &) = delete;
virtual ~productParent(){}
virtual ProductTypeItem getProductName(){}
protected:
ProductTypeItem mType;
};
class productApple : public productParent
{
public:
explicit productApple(ProductTypeItem type) : productParent(type){}
productApple(const productApple &) = delete;
productApple &operator=(const productApple &) = delete;
~productApple(){}
};
class productBanana : public productParent
{
public:
explicit productBanana(ProductTypeItem type) : productParent(type){}
productBanana(const productBanana &) = delete;
productBanana &operator=(const productBanana &) = delete;
~productBanana(){}
};
#endif // PRODUCT_H
- 工厂类
#ifndef FACTORYABSTRACT_H
#define FACTORYABSTRACT_H
#include "product.h"
class MyFactory
{
public:
MyFactory(){}
~MyFactory(){}
// 有的也会把创建方法写成静态,那么这个方法就属于类,不用创建对象也能使用
// static productParent *createProduct(ProductTypeItem type)
productParent *createProduct(ProductTypeItem type)
{
switch (type)
{
case PRODUCT_ITEM_APPLE:
return new productApple(type);
case PRODUCT_ITEM_BANANA:
return new productBanana(type);
default:
break;
}
return nullptr;
}
};
#endif // FACTORYABSTRACT_H
- main函数
#include "factory.h"
int main()
{
MyFactory factory;
productParent *apple = factory.createProduct(PRODUCT_ITEM_APPLE);
productParent *banana = factory.createProduct(PRODUCT_ITEM_BANANA);
delete apple;
delete banana;
return 0;
}