从零开始最简单Qt/C++设计模式总结四:工厂模式(简单工厂、一般工厂及抽象工厂)

9 篇文章 2 订阅

1简单工厂

简单工厂使用一个工厂类,通过类型代码管理不同的产品的生产过程

#include <QCoreApplication>
#include <QList>
#include <QDebug>


///NOTE:4简单工厂模式的例子--20190212
///简单工厂的作用是使用一个工厂类统一管理某产品的生产过程(即某类的实例化过程)
/// 使得通过修改配置改变生产的产品变得简单

//家具类接口
class Furniture
{
public:
    virtual ~Furniture() {}
    virtual void Operation() = 0;
};

//床
class BedFurniture: public Furniture
{
public:
    void Operation()
    {
        qDebug() << "Bed Operation";
    }
};
//椅子
class ChairFurniture: public Furniture
{
public:
    void Operation()
    {
        qDebug() << "Chair Operation";
    }
};

//工厂接口
class Factory
{
public:
    virtual ~Factory() {}
    virtual Furniture* CreateProduct(int nType) = 0;
};

//家具工厂
class FurnitureFactory: public Factory
{
public:
    Furniture* CreateProduct(int nType)
    {
        switch (nType)
        {
        case 0:
            return new BedFurniture();
            break;
        case 1:
            return new ChairFurniture();
            break;
        default:
            return nullptr;
            break;
        }
    }
};


int main(int, char **)
{
    ///简单工厂模式测试
    Factory *factory = new FurnitureFactory();
    Furniture *bed = factory->CreateProduct(0);
    Furniture *chair = factory->CreateProduct(1);
    bed->Operation();
    chair->Operation();
    delete bed;
    delete chair;
    delete factory;
    getchar();
}

结果

在这里插入图片描述

2一般工厂模式

一般工厂为每个产品的生产创建一个工厂子类进行生产,换言之,现在工厂的分工更细了,不需要一个工厂通过区分订单类型来决定生产的是什么家具了

#include <QCoreApplication>
#include <QList>
#include <QDebug>

///NOTE:5工厂模式的例子--20190212

//家具类接口
class Furniture
{
public:
    virtual ~Furniture() {}
    virtual void Operation() = 0;
};

//床
class BedFurniture: public Furniture
{
public:
    void Operation()
    {
        qDebug() << "Bed Operation";
    }
};
//椅子
class ChairFurniture: public Furniture
{
public:
    void Operation()
    {
        qDebug() << "Chair Operation";
    }
};

//工厂接口
class Factory
{
public:
    virtual ~Factory() {}
    virtual Furniture*CreateProduct() = 0;
};

//床工厂
class BedFactory: public Factory
{
public :
    BedFurniture *CreateProduct()
    {
        return new BedFurniture();
    }
};
//椅子工厂
class ChairFactory: public Factory
{
public :
    ChairFurniture *CreateProduct()
    {
        return new ChairFurniture();
    }
};

int main(int, char **)
{
    ///工厂模式测试
    Factory *factory = nullptr;

    factory = new BedFactory();
    Furniture *bed = factory->CreateProduct();
    factory = new ChairFactory();
    Furniture *chair = factory->CreateProduct();

    bed->Operation();
    chair->Operation();
    delete bed;
    delete chair;
    delete factory;
    
    getchar();
}
结果同上

在这里插入图片描述

3抽象工厂模式

抽象工厂模式把工厂也进行了抽象,工厂接口中含有每个产品的生产过程接口,因此每个工厂子类都有生产所有产品的能力,根据不同需求进行生产。

///NOTE:6抽象工厂模式的例子--20190212

//家具类接口
class Furniture
{
public:
    virtual ~Furniture() {}
    virtual void Operation() = 0;
};

//床
class BedFurniture: public Furniture
{
public:
    void Operation()
    {
        qDebug() << "Bed Operation";
    }
};
//椅子
class ChairFurniture: public Furniture
{
public:
    void Operation()
    {
        qDebug() << "Chair Operation";
    }
};

//工厂接口
class Factory
{
public:
    virtual ~Factory() {}
    virtual Furniture *CreateBed() = 0;
    virtual Furniture *CreateChair() = 0;
};

//杰克牌家具厂
class JackFactory: public Factory
{
public:
    JackFactory()
    {
        qDebug() << "These furnitures are Jack's";
    }
    Furniture *CreateBed()
    {
        return new BedFurniture();
    }
    Furniture *CreateChair()
    {
        return new ChairFurniture();
    }
};

// 罗斯牌家具厂
class RoseFactory: public Factory
{
public:
    RoseFactory()
    {
        qDebug() << "These furnitures are Rose's";
    }
    Furniture *CreateBed()
    {
        return new BedFurniture();
    }
    Furniture *CreateChair()
    {
        return new ChairFurniture();
    }
};


int main(int, char **)
{
    ///抽象工厂模式测试
    Factory *factory = nullptr;

    factory = new JackFactory();
    Furniture *jackbed = factory->CreateBed();
    Furniture *jackchair = factory->CreateChair();
    jackbed->Operation();
    jackchair->Operation();
    factory = new RoseFactory();
    Furniture *rosebed = factory->CreateBed();
    Furniture *rosechair = factory->CreateChair();
    rosebed->Operation();
    rosechair->Operation();

	delete jackbed;
	delete jackchair;
	delete rosebed;
	delete rosebed;
	delete factory;
    getchar();
}
结果

在这里插入图片描述

4简单记忆三种工厂模式

简单工厂:一个家具厂生产所有家具,根据订单(类型)区分
工厂模式:不同的家具由不同的家具厂生产
抽象工厂:所有的工厂都能生产所有家具,根据品牌(需求)区分

分析思路部分来自 https://www.cnblogs.com/cxjchen/p/3143633.html 感谢!

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值