创建型 简单工厂(工厂方法)模式

工厂模式 :定义一个用于创建对象的接口,让子类决定实例化哪一个类。

​ 属于创建型模式。

工厂模式(Factory Pattern): 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

简单工厂模式的实现:

1:逻辑分析:

​ 1:产品的创建交给一个单独的类来管理

​ 2:此类提供全局的访问接口,根据输入条件的不同来创建不同的对象

2:使用分析

​ 1:创建工厂,根据输入的条件来创建对应的产品

​ 2:在创建产品时,返回产品的接口指针

​ 3:通过此指针来操作相应的对象

3:参考demo源码

/**************************************************************
简单工厂:
    1.产品的创建交给一个单独的类来管理
    2.此类提供全局的访问接口,根据输入条件的不同来创建不同的对象
使用:
    1.创建工厂,根据输入的条件来创建对应的产品
    2.在创建产品时,返回产品的接口指针
    3.通过此指针来操作相应的对象
***************************************************************/
#include <iostream>
#include <string.h>
using namespace std;
class Fruit
{ 
public:
    virtual void getFruit() = 0;
    virtual ~Fruit() {};
};

class Banana : public Fruit
{
public:
    virtual void getFruit()
    {
        cout << "香蕉" << endl;
    }
};

class Pear : public Fruit
{
public:
    virtual void getFruit()
    {
        cout << "梨子" << endl;
    }
};

class Factory
{
public:
    static Fruit* Create(const char *name)
    {
        Fruit *tmp = NULL;
        if (strcmp(name, "pear") == 0)
        {
            tmp = new Pear();
        }
        else if (strcmp(name, "banana") == 0)
        {
            tmp = new Banana();
        }
        else
        {
            return NULL;
        }
        return tmp;
    }
};
int main()
{
    Fruit *pear = Factory::Create("pear");
    if (pear == NULL)
    {
        cout << "创建pear失败\n";
    }
    pear->getFruit();
    Fruit *banana = Factory::Create("banana");
    if (banana == NULL)
    {
        cout << "创建banana失败\n";
    }
    banana->getFruit();

    if(pear != nullptr)
    {
        delete pear;
        pear = nullptr;
    }

    if(banana != nullptr)
    {
        delete banana;
        banana = nullptr;
    }
    return 0;
}

思考:这里的工厂类依赖函数的入参决定,内部做判断进行初始化,可以用继承的方式,用特定的类来对其特定工厂进行初始化。

工厂方法模式

逻辑分析:

​ 父类负责定义创建对象的公共接口,子类负责具体以的对象。

​ 类的实例化操作延迟到子类中完成,子类决定创建的对象实例类型。

源码demo:

/*********************************************************
工厂方法:
    与简单工厂的区别,将产品的创建分别委托给单独的类,即一个工厂对应一个产品
    而不是将所有产品的创建交给一个类来管理
    1.首先创建工厂
    2.通过此工厂来获取对应的产品(将对象的创建放到工厂中创建)
***********************************************************/
#include <iostream>
#include <string.h>
using namespace std;

//工厂具体产品基类 
class Fruit
{
public:
    virtual void sayname() = 0;
    virtual ~Fruit(){};
};

//工厂对象基类
class FruitFactory
{
public:
    virtual Fruit* getFruit() = 0;
    virtual void destroyFruit() = 0;
    virtual ~FruitFactory() {};
};

//每个产品对应一个产品属性类和工厂创建类
class Banana : public Fruit
{
public:
    virtual void sayname()
    {
        cout << "Banana " << endl;
    }
};

//每一个对象的实例化其实就是一个产品
class BananaFactory : public FruitFactory
{
public:
    virtual Fruit* getFruit()
    {
        _ba = new Banana;
        return _ba;
    }

    virtual void destroyFruit()
    {
        if(_ba != nullptr)
        {
            delete _ba;
            _ba = nullptr;
        } 
    }
public:
    Banana* _ba;
};

//每个产品对应一个产品属性类和工厂创建类
class Apple : public Fruit
{
public:
    virtual void sayname()
    {
        cout << "Apple " << endl;
    }
};

class AppleFactory : public FruitFactory
{
public:
    virtual Fruit* getFruit()
    {
        _ap = new Apple;
        return _ap;
    }

    virtual void destroyFruit()
    {
        if(_ap != nullptr)
        {
            delete _ap;
            _ap = nullptr;
        } 
    }
public:
    Apple * _ap;
};
int main()
{
    FruitFactory * ff = new BananaFactory();
    Fruit *fruit = ff->getFruit();
    fruit->sayname();
    ff->destroyFruit();
    // delete fruit;
    delete ff;

    ff = new AppleFactory();
    fruit = ff->getFruit();
    fruit->sayname();
    ff->destroyFruit();
    // delete fruit;
    delete ff;
    return 0;
}

思考如何扩展:如果产品有多个属性时,可以扩展工厂的函数参数来构造产品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值