热门标签 | 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;
}

推荐阅读
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
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社区 版权所有