热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【嵌入式c++】设计模式之工厂模式简单工厂模式(simpleFactory)

题目描述:Factory动机(motivation)实例化对象的时候不再使用newObject()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说&

题目描述:


Factory


动机(motivation)

实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。


模式定义

根据需求创建对象的种类。
——《设计模式》GoF


要点总结

有时会和其他模式解和使用,我们无需提供具体的子类类名,只需要提供一个字符串即可得到相应的实例对象。这样的话,当子类的类名更换或者增加子类时我们都无需修改客户端代码,只需要在简单工厂类上增加一个分支判断代码即可。


代码结构

.
├── build.sh
├── clearBuild.sh
├── CMakeLists.txt
├── src
│ ├── examStu.cpp
│ ├── include
│ │ └── examStu.h
│ └── main.cpp

源码例子

examStu.h

#ifndef _EXANSTU__
#define _EXANSTU__
#include
#include
#include
using namespace std;typedef enum _eShoesType{SHOES_TYPE_BASE = 0,SHOES_TYPE_NIKE = 1,SHOES_TYPE_ADIDAS = 2,SHOES_TYPE_HUILI = 3,SHOES_TYPE_ERROR = -1
}eShoesType;class ShoesBase
{
public:ShoesBase(){cout << "ShoesBase() called"<<endl;}virtual ~ShoesBase(){cout << "~ShoesBase() called"<<endl;}virtual void ShowTag()&#61;0;private:int _shoesBase;
};class NikeShoes :public ShoesBase
{
public:NikeShoes(){cout << "NikeShoes() called"<<endl;}virtual ~NikeShoes(){cout << "~NikeShoes() called"<<endl;}void ShowTag() override {cout << "NikeShoes::ShowTag() called"<<endl;}private:};class AdidasShoes: public ShoesBase
{
public:AdidasShoes(){cout << "AdidasShoes() called"<<endl;}virtual ~AdidasShoes(){cout << "~AdidasShoes() called"<<endl;}void ShowTag() override {cout << "AdidasShoes::ShowTag() called"<<endl;}};class HuiLiShoes: public ShoesBase
{
public:HuiLiShoes(){cout << "HuiLiShoes() called"<<endl;}virtual ~HuiLiShoes(){cout << "~HuiLiShoes() called"<<endl;}void ShowTag() override {cout << "HuiLiShoes::ShowTag() called"<<endl;}};class ShoesFactory
{
public:ShoesFactory(){cout << "ShoesFactory() called"<<endl;}virtual ~ShoesFactory(){cout << "~ShoesFactory() called"<<endl;}std::shared_ptr<ShoesBase> CreateShoes(eShoesType shoesType);};#endif

examStu.cpp

#include
#include
#include
#include"examStu.h"using namespace std;std::shared_ptr<ShoesBase> ShoesFactory::CreateShoes(eShoesType shoesType)
{cout << "create sheoes class"<<endl;std::shared_ptr<ShoesBase> pShoes &#61; nullptr;switch(shoesType){case SHOES_TYPE_NIKE:cout << "create nike class "<<endl;pShoes &#61; std::make_shared<NikeShoes>();break;case SHOES_TYPE_ADIDAS:cout << "create AdidasShoes class"<<endl;pShoes &#61; std::make_shared<AdidasShoes>();break; case SHOES_TYPE_HUILI:cout << "create HuiLiShoes class"<<endl;pShoes &#61; std::make_shared<HuiLiShoes>();break; default:cout << "create shoes type not found!!"<<endl;break;}if(pShoes &#61;&#61; nullptr){cout << "create shoes class error!!"<<endl;}return pShoes;
}

main.cpp

#include
#include
#include
#include "examStu.h"using namespace std;int main(int argc, char *argv[])
{ShoesFactory shoesFactory;std::shared_ptr<ShoesBase> pHuiLishoes &#61; shoesFactory.CreateShoes(SHOES_TYPE_HUILI);pHuiLishoes->ShowTag(); std::shared_ptr<ShoesBase> pNikeshoes &#61; shoesFactory.CreateShoes(SHOES_TYPE_NIKE);pNikeshoes->ShowTag();std::shared_ptr<ShoesBase> pAdidasshoes &#61; shoesFactory.CreateShoes(SHOES_TYPE_ADIDAS);pAdidasshoes->ShowTag();return 0;
}

推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
author-avatar
ACHEn大魔王
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有