简介

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

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

C++设计模式之工厂模式相关推荐

  1. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  2. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  3. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  5. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  6. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  7. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  8. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  9. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

  10. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. 3d触控怎么测试软件,如何检测iPhone 8的3D Touch灵敏度
  2. poj 2034 Anti-prime Sequences(dfs)
  3. 无法嵌入互操作类型 请改用适用的接口。
  4. Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
  5. opengl用什么软件写_汇才论文工具分享:写科研论文的都在用这些截图软件
  6. Windows下配置sphinx+reStructuredText详解
  7. c++函数传参:值传递、指针传递、引用传递
  8. Taro+react开发(13)--多加/不然不能跳转
  9. STM32移植UCGUI3.90笔记
  10. 顶级程序员的心得–Coders at Work
  11. c语言switch scanf语句,c语言switch语句 谢谢·!~!~
  12. NVIDIA 发布 60 余项 CUDA-X 库更新,加速量子计算和 6G 研究等
  13. Citrix StoreFront无法正常初始化
  14. 递增序列(迭代加深)
  15. 单链表逆置-java(递归与非递归)
  16. js调用微信扫一扫demo_微信JSSDK调用微信扫一扫功能的方法
  17. 图像去雾算法学习笔记1——何凯明博士基于暗通道先验的单幅图像去雾算法公式推导
  18. Jlink接口引脚定义
  19. win10更新后IE不见了
  20. c语言加减运算编程 定点小数,浮点运算改定点运算

热门文章

  1. 在GPT分区的磁盘上创建ESP分区图文教程
  2. Java生成PDF文件保存到本地磁盘
  3. 用c语言编写界面,「分享」C语言如何编写图形界面
  4. Typora+gitee+PicGo+坚果云 实现Typora文件的保存完整保存
  5. C#XML序列化特性全中文教程
  6. Java识别获取pdf中文字信息(此方法任意pdf的信息都可以拿到)
  7. zblogphp登录和注册_基于PHP的登录和注册的功能的实现
  8. 【C语言】预处理的深入理解(第一期)
  9. OpenCV联合Image Watch使用中关于RGB和HSV转换相关知识点
  10. 如何给电脑安装双系统,电脑安装双系统教程