码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法模式

时间:2020-04-14 12:37:57      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:void   类图   代码   增加   protect   null   main   cto   clu   

工厂方法模式

工厂方法模式其实也很简单,先放一张UML类图来看一下类结构:

技术图片

由图我们可以看出有两个基类:

  • BaseFactory
    • AppleFactory
    • PearFactory
  • Fruit
    • Apple
    • Pear

AppleFactory负责创建Apple类,PearFactory负责创建Pear类。下面放代码实现:

  • fruit.h
#ifndef FRUIT_H
#define FRUIT_H
class Fruit
{
public:
    Fruit();
    virtual ~Fruit();
    virtual void FruitType() = 0;
};

class Apple : public Fruit
{
public:
    Apple();
    virtual ~Apple() override;
    virtual void FruitType() override;
};

class Pear : public Fruit
{
    public:
    Pear();
    virtual ~Pear() override;
    virtual void FruitType() override;
};
#endif // FRUIT_H
  • fruit.cpp
#include <QDebug>
#include "fruit.h"


void Apple::FruitType()
{
    qDebug() << "I am an Apple";
}

void Pear::FruitType()
{
    qDebug() << "I am an Pear";
}
  • basefactory.h
#include "fruit.h"
class BaseFactory
{
public:
    BaseFactory();
    virtual ~BaseFactory();
    virtual Fruit* Produce() = 0;

protected:
    Fruit* m_Fruit;
};

class AppleFactory : public BaseFactory
{
public:
    AppleFactory();
    virtual ~AppleFactory() override;
    virtual Fruit* Produce() override;
};

class PearFactory : public BaseFactory
{
public:
    PearFactory();
    virtual ~PearFactory() override;
    virtual Fruit* Produce() override;
};

#endif // BASEFACTORY_H
  • basefactory.cpp
#include <QDebug>
#include "basefactory.h"

#define DELETEOBJECT(x) if(x != nullptr) { delete x; x = nullptr;}
BaseFactory::BaseFactory()
{

}

BaseFactory::~BaseFactory()
{
    DELETEOBJECT(m_Fruit);
}

AppleFactory::AppleFactory()
{

}

AppleFactory::~AppleFactory()
{

}

Fruit *AppleFactory::Produce()
{
    m_Fruit = new Apple();
    return m_Fruit;
}

PearFactory::PearFactory()
{

}

PearFactory::~PearFactory()
{

}

Fruit *PearFactory::Produce()
{
    m_Fruit = new Pear();
    return m_Fruit;
}
  • main.cpp
#include <QCoreApplication>
#include "basefactory.h"

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

    BaseFactory* factory = new AppleFactory();
    factory->Produce()->FruitType();

    factory = new PearFactory();
    factory->Produce()->FruitType();

    return a.exec();
}

main函数只用到了BaseFactory基类工厂,很好的实现了细节的隐藏从而增加了代码的复用性。

工厂方法模式遵照了以下几个设计原则:

  1. 依赖倒转原则
  2. 开放封闭原则
  3. 迪米特法则

工厂方法模式

标签:void   类图   代码   增加   protect   null   main   cto   clu   

原文地址:https://www.cnblogs.com/wzxNote/p/12696904.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!