简介
在实际项目中,工厂模式是用的比较多的, 这篇文章也主要是通过具体的简单的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用来获取是哪种家蓄。 在这里用到了多肽, 可以发现,有很多种设计模式都用到了多肽, 实现把子类对象向上转型为父类对象。
所以针对工厂模式的要点在于把每种相关的,各自创建自对应的类, 它们再抽象出一个父类, 客户端通过类型码来获取,对应的内容。