C++简单工厂模式的学习
我们先从最常见的C++类的一个实现开始说起,
class API
{
public:
virtual test(std::string s)=0;
protected:
API(){};
};
class ImpleOne :public API {
public:
void test(string s) override {
std::cout << "现在是One在执行 " << s<<std::endl;
}
}; int main(void)
{
API * pApi=new ImpleOne();
pApi->test();
return;
}
这样的代码就会破坏我们面向对象的封装性,因为调用者会知道API和IMPLEONE的存在。
怎么样完成高内聚,低耦合这个要求那?
那就用一下我们的简单工厂模式,在头文件中
#include<iostream>
#include<string>
#include<map>
//建立函数指针
typedef void* (*Constructor)(); //创建一个工厂.
class CObjectFactory
{
public:
//注册对应的类添加到容器中
static void RegsiterClass(std::string classname, Constructor constructor)
{
constructors()[classname] = constructor;
}
//创建一个类的对象并返回
static void* CreateObject(const std::string ClassName)
{
Constructor constructor = nullptr;
if (constructors().find(ClassName) != constructors().end())
{
constructor = constructors().find(ClassName)->second;
}
if (constructor == nullptr)
{
return nullptr;
}
return (*constructor)();
}
private:
//返回一个容器
static std::map<std::string, Constructor>& constructors()
{
static std::map<std::string, Constructor> instance;
return instance;
} }; //注册我们的类的宏定义
#define REG_CLASS(class_name) \
class class_name##Helper{ \
public: \
class_name##Helper(){ \
CObjectFactory::RegsiterClass(#class_name,class_name##Helper::CreateObjFunc); \
}; \
static void*CreateObjFunc() \
{ \
return new class_name; \
} \
};\
static class_name##Helper class_name##helper; //加入static是指只在头文件中有效。
然后就是如何调用这个简单工厂
//在这里可以通过读取配置文件,或者直接修改REG_CLASS和CreateObject中的字符串,就可以完成对这个类的改变,或者更新 ,并不影响后面代码的更改。
REG_CLASS(ImpleOne)
class AUTOFACTORY
{
public:
std::shared_ptr<Api> CreateAPI()
{ std::shared_ptr<API> Apipointer(static_cast<API*>(CObjectFactory::CreateObject("ImpleOne")));
return Apipointer;
}
}
int main(void)
{
std::shared_ptr<Api> testpoint(AUTOFACTORY::CreateAPI());
testpoint->test("我不是你爸爸!");
return;
}
总结一下:我们可以通过创建一个类作为工厂提供我们所需要的类,并且通过一个辅助注册的类,使我们需要的类注册到我们的工厂里面,我们的调用者可以不通过知道我们类中的具体实现,就可以获取到他们所需的类,并且完好的实现了类的封装性.我们在以后修改或者替换我们的类的时候就不会影响调用者的代码。
C++简单工厂模式的学习的更多相关文章
- C#简单工厂模式(学习Learning hard讲解笔记)
原味地址http://www.cnblogs.com/zhili/p/SimpleFactory.html 简单工厂模式通俗的理解就是用户与工厂的关系,用户用的东西,工厂来生成,责任明确. 就像大神展 ...
- 派生类&简单工厂模式
派生类&简单工厂模式 git链接: Operation3.1.1 题目描述的代码部分的解释 首先是声明一个Rand类作为父类,然后两个子类RandNumber类和RandOperation类, ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- 设计模式之简单工厂模式(C#语言描述)
严格意义上来说,简单工厂模式并不属于GoF的23种设计模式,但是它是学习其他工厂模式的基础和前提条件.理解了简单工厂模式,学习工厂方法模式和抽象工厂模式会比较容易一些. 简单工厂模式的定义 定义一个工 ...
- 【2016-10-17】【坚持学习】【Day8】【简单工厂模式】
今天学习简单工厂模式, 结构 一个抽象产品 多个具体产品 一个工厂类,通过传入参数,new出不同的产品 代码: abstract class Product { //所有产品类的公共业务方法 publ ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- 再起航,我的学习笔记之JavaScript设计模式05(简单工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前几 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
随机推荐
- 使用etcd选举sdk实践master/slave故障转移
本次将记录[利用etcd选主sdk实践master/slave高可用], 并利用etcdctl原生脚本验证选主sdk的工作原理. master/slave高可用集群 本文目标 在异地多机房部署节点,s ...
- 全栈交叉编译X86完成过程经验分享
1 CMAKE的交叉编译配置 主要是C和C++编译器的配置和SYSROOT的配置. set (CMAKE_SYSTEM_NAME "Linux") set (CMAKE_SYSTE ...
- input 标签的 pattern 属性
定义和用法 pattern 属性规定用于验证输入字段的模式. 模式指的是正则表达式. 注释:pattern 属性适用于以下 <input>类型:text, search, url, tel ...
- css的过渡transition和动画animation
过渡 过渡(transition)是CSS3中具有颠覆性的特性之一,我们可以在不使用Flash动画或JavaScript的情况下,当元素从一种样式变换为另一种样式时元素添加效果.过渡动画:是从一个状态 ...
- 攻防世界-MISC:掀桌子
这是攻防世界新手练习区的第八题,题目如下: 就给了一串16进制的字符串.哎,又是不懂,看了一下官方WP,说是将每两位16进制数转换为10进制,再减去128再转换为ASCII码.直接上脚本 str1 = ...
- C# 一维数组如何快速实现数组元素的数据类型的转换?
一.场景假设 假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开.要求用此字符串中的数字快速生成int类型的数组,且尽可能使用最少的代码量. string str = "1 ...
- 【CSAPP】Architecture Lab 实验笔记
archlab属于第四章的内容.这章讲了处理器体系结构,就CPU是怎样构成的.看到时候跃跃欲试,以为最后实验是真要去造个CPU,配套资料也是一如既往的豪华,合计四十多页的参考手册,一大包的源码和测试程 ...
- 【Python数据分析案例】python数据分析老番茄B站数据(pandas常用基础数据分析代码)
一.爬取老番茄B站数据 前几天开发了一个python爬虫脚本,成功爬取了B站李子柒的视频数据,共142个视频,17个字段,含: 视频标题,视频地址,视频上传时间,视频时长,是否合作视频,视频分区,弹幕 ...
- SQL注入的几种类型
SQL注入就是: 将构造SQL语句来插入到web提交的数据之中,让其返回数据时运行自己构造的恶意SQL语句. SQL注入构造恶意SQL语句的方法有: 构造堆叠,构造闭合,构造报错,构造时间差,等等 S ...
- git rename branch
git 不能直接重命名远程分支,如果需要重命名则执行以下步骤操作: 重命名本地分支 删除远程分支 推送本地分支(重命名后的)到远程 额外说明: 1. 重命名后的分支也会保留历史 commit(应该是本 ...