C++设计模式之工厂模式

简介

在实际项目中,工厂模式是用的比较多的, 这篇文章也主要是通过具体的简单的C++的一个实例来解释工厂模式。

效果图

项目整体文件

这里写图片描述


生产出一个鸭子的实例

这里写图片描述


生产出一只鸡的实例

这里写图片描述


主要代码

//chichen相关代码

#ifndef CHICHEN_H
#define CHICHEN_H
#include "homestorage.h"

class chichen : public HomeStorage
{
public:
    chichen();
    void crow();
    void feed();
    void sleep();
};

#endif // CHICHEN_H


//chichen.cpp
#include "chichen.h"

chichen::chichen()
{
}

void chichen::crow()
{
    cout << "void chichen::crow()" << endl;
}

void chichen::feed()
{
    cout << "void chichen::feed()" << endl;
}

void chichen::sleep()
{
    cout << "void chichen::sleep()" << endl;
}

duck文件相关代码:

#ifndef DUCK_H
#define DUCK_H
#include "homestorage.h"

class duck : public HomeStorage
{
public:
    duck();
    void crow();
    void feed();
    void sleep();
};

#endif // DUCK_H



//duck.cpp
#include "duck.h"

duck::duck()
{
}

void duck::crow()
{
    cout << "void duck::crow()" << endl;
}

void duck::feed()
{
    cout << "void duck::feed()" << endl;
}

void duck::sleep()
{
    cout << "void duck::sleep()" << endl;
}

//farmers

#ifndef FARMERS_H
#define FARMERS_H

#include "homestorage.h"
#include "duck.h"
#include "chichen.h"

class Farmers
{
public:
    enum HomeStorageType {
      CHICHEN = 0,
      DUCK
    };
    Farmers();

   HomeStorage* getHomeStorage(int type);


private:
   HomeStorage *m_homestorage;
};

#endif // FARMERS_H





#include "farmers.h"

Farmers::Farmers()
    :m_homestorage(NULL)
{
}

HomeStorage* Farmers::getHomeStorage(int type)
{
    if(!m_homestorage) {
        delete m_homestorage;
        m_homestorage = NULL;
    }

    if(type == CHICHEN) {
        m_homestorage = new chichen();
    } else if (type == DUCK) {
        m_homestorage = new duck();
    }

    return m_homestorage;
}

homestorage相关

#ifndef HOMESTORAGE_H
#define HOMESTORAGE_H
#include <stdio.h>
#include <iostream>
using namespace::std;

class HomeStorage
{
public:
    HomeStorage();

    virtual void crow() = 0;
    virtual void feed() = 0;
    virtual void sleep() = 0;
};

#endif // HOMESTORAGE_H



#include "homestorage.h"

HomeStorage::HomeStorage()
{
}

main函数

#include <QCoreApplication>

#include "farmers.h"
#include "homestorage.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Farmers LiRuiDong;

    HomeStorage *homeStorage = LiRuiDong.getHomeStorage(Farmers::CHICHEN);
    homeStorage->crow();
    homeStorage->feed();
    homeStorage->sleep();

    return a.exec();
}

主要代码解析

在这个实例中, 有一个家蓄的类HomeStorage, 它用纯虚函数

    virtual void crow() = 0;
    virtual void feed() = 0;
    virtual void sleep() = 0;

用来描述进食, 睡觉 和 发音。 后面的每种动物继承于它,并要求一定需要重写, 因为纯虚函数的原因。

而Farmers 类的getHomeStorage用来获取是哪种家蓄。 在这里用到了多肽, 可以发现,有很多种设计模式都用到了多肽, 实现把子类对象向上转型为父类对象。

所以针对工厂模式的要点在于把每种相关的,各自创建自对应的类, 它们再抽象出一个父类, 客户端通过类型码来获取,对应的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
工厂模式是一种常见的创建型设计模式,用于创建对象,而不是通过直接调用构造函数来创建它们。工厂模式定义了一个接口,用于创建相关对象,但是让子类决定要实例化的类。在C++中,工厂模式可以通过以下步骤实现: 1. 创建一个抽象基类,该类定义了一个纯虚拟函数,该函数将返回一个指向基类的指针。这个基类就是我们的工厂接口。 ```c++ class Product { public: virtual ~Product() {} virtual void operation() = 0; }; ``` 2. 创建具体的产品类,它们继承自抽象基类,并实现了其纯虚拟函数。这些类就是我们的具体产品。 ```c++ class ConcreteProductA : public Product { public: void operation() override { /* 具体产品 A 的操作 */ } }; class ConcreteProductB : public Product { public: void operation() override { /* 具体产品 B 的操作 */ } }; ``` 3. 创建一个工厂类,该类实现了工厂接口,并根据需要创建具体的产品。这个工厂类就是我们的具体工厂。 ```c++ class Factory { public: virtual ~Factory() {} virtual std::unique_ptr<Product> createProduct() = 0; }; class ConcreteFactoryA : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductA>(); } }; class ConcreteFactoryB : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductB>(); } }; ``` 4. 在客户端代码中使用具体工厂创建具体产品。 ```c++ int main() { std::unique_ptr<Factory> factory = std::make_unique<ConcreteFactoryA>(); std::unique_ptr<Product> product = factory->createProduct(); product->operation(); return 0; } ``` 这就是工厂模式的基本实现方式。通过这种方式,我们可以将对象的创建过程与客户端代码分离,从而更好地实现模块化和可扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小K小Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值