您的位置:首页 > 编程语言 > C语言/C++

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

2016-04-21 22:09 399 查看

简介

在实际项目中,工厂模式是用的比较多的, 这篇文章也主要是通过具体的简单的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用来获取是哪种家蓄。 在这里用到了多肽, 可以发现,有很多种设计模式都用到了多肽, 实现把子类对象向上转型为父类对象。

所以针对工厂模式的要点在于把每种相关的,各自创建自对应的类, 它们再抽象出一个父类, 客户端通过类型码来获取,对应的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: