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之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
随机推荐
- 技术分享 | Web自动化之Selenium安装
Web 应用程序的验收测试常常涉及一些手工任务,例如打开一个浏览器,并执行一个测试用例中所描述的操作.但是手工执行的任务容易出现人为的错误,也比较费时间.因此,将这些任务自动化,就可以消除人为因素.S ...
- js call与bind和apply的区别
介绍 在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢. 在说区别之前还是先总结一下三者的相似之处: 1.都是用来改变函数的this对象的指向的. 2.第一个参数都是thi ...
- go学习第一课--语法基础
一.hello world 新建文件helloworld.go package main import "fmt" func main() { fmt.Println( ...
- IOC容器--1.12. 基于 Java 的容器配置
用Java的方式配置Spring ,不使用Spring的XML配置,全权交给Java来做 JavaConfig是Spring的一个子项目,在Sring 4 之后成为核心功能 这种纯Java的配置方式 ...
- 团队Beta2
队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 接下来的计划 完成短租车,页面美化 **还 ...
- 工程师姓什么很重要!别再叫我“X工”!!!
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 工程师之间都是这么互相打招呼的-- "高工,你设计图通过了么?" &quo ...
- C++进阶-3-5-set/multiset容器
C++进阶-3-5-set/multiset容器 1 #include<iostream> 2 #include<set> 3 using namespace std; 4 5 ...
- 过早的给方法中 引用对象 设为 null 可被 GC提前回收吗?
经常在代码中看到有人将 null 赋值给引用类型,来达到让 GC 提前回收的目的,这样做真的有用吗?今天我们就来研究一下. 为了方便讲解,来一段测试代码,提前将 test1=null ,然后调用 GC ...
- 自增特性,外键,级联更新与级联删除,表间关系,SELECT用法,GROUP BY
自增特性 自动增长的作用: 问题:为数据表设置主键约束后,每次插入记录时,如果插入的值已经存在,会插入失败. 如何解决:为主键生成自动增长的值. 自动增长的语法: 字段名 数据类型 AUTO_INCR ...
- 华为OPS,自定义命令,动态执行命令
OPS 开放可编程系统OPS(Open Programmability System)是指设备通过提供统一的应用程序接口API(Application Programming Interfa ...