常用设计模式之简单工厂模式

简单工厂模式 (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;
}
作者:喝碗糖水原文地址:https://www.cnblogs.com/LifeAndSuger/p/17012913.html

%s 个评论

要回复文章请先登录注册