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

简单工厂模式 (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;
}
posted @ 2022-12-29 22:24  喝碗糖水  阅读(71)  评论(0编辑  收藏  举报