工厂类

factory.h

#pragma once#include <functional>
#include <memory>
#include <unordered_map>template <typename T, typename... Args>
class Factory {public:static Factory& Instance() {if (!instance_) {instance_ = new Factory<T, Args...>();}return *instance_;}void Register(const std::string& name,std::function<std::shared_ptr<T>(Args...)> creator) {creators_[name] = creator;}std::shared_ptr<T> Create(const std::string& name, Args... args) {return creators_.find(name) == creators_.end() ? std::shared_ptr<T>(): creators_[name](args...);}private:Factory() {}static Factory<T, Args...>* instance_;std::unordered_map<std::string, std::function<std::shared_ptr<T>(Args...)>>creators_;
};template <typename T, typename... Args>
Factory<T, Args...>* Factory<T, Args...>::instance_ = nullptr;

注册类

register.h

#pragma once#include "factory.h"template <typename Base, typename Impl, typename... Args>
class Register {public:explicit Register(const std::string& name) {Factory<Base, Args...>& factory = Factory<Base, Args...>::Instance();factory.Register(name, [](Args... args) {return std::shared_ptr<Base>(new Impl(args...));});}
};

基类

shoes.h

#pragma once#include "factory.h"class Shoes {public:explicit Shoes(const int& number) : number_(number) {};virtual void Message() = 0;virtual ~Shoes() = default;protected:const int number_;
};typedef Factory<Shoes, int> ShoesFactory;

car.h

#pragma once#include "factory.h"class Car {public:explicit Car(const int& number, const std::string &size) : number_(number), size_(size) {};virtual void Message() = 0;virtual ~Car() = default;protected:const int number_;const std::string size_;
};typedef Factory<Car, int, std::string> CarFactory;

派生类

nike.cc

#include <iostream>
#include "register.h"
#include "shoes.h"class Nike : public Shoes {public:explicit Nike(const int& number) : Shoes(number) {}void Message() {std::cout << number_ << " Nike shoes !" << std::endl;}
};namespace {Register<Shoes, Nike, int> _("nike"); // 注册该类,namespace{}防止变量"_"重复定义,.cc文件才会自动执行该语句,.h文件不执行
}

anta.cc

#include <iostream>
#include "register.h"
#include "shoes.h"class Anta : public Shoes {public:explicit Anta(const int& number) : Shoes(number) {}void Message() {std::cout << number_ << " Anta shoes !" << std::endl;}
};namespace {Register<Shoes, Anta, int> _("anta");
}

benz.cc

#include <iostream>
#include "register.h"
#include "car.h"class Benz : public Car {public:explicit Benz(const int& number, const std::string &size) : Car(number, size) {}void Message() {std::cout << number_ << " " << size_ << " Benz car !" << std::endl;}
};namespace {Register<Car, Benz, int, std::string> _("benz");
}

audi.cc

#include <iostream>
#include "register.h"
#include "car.h"class Audi : public Car {public:explicit Audi(const int& number, const std::string &size) : Car(number, size) {}void Message() {std::cout << number_ << " " << size_ << " Audi car !" << std::endl;}
};namespace {Register<Car, Audi, int, std::string> _("audi");
}

主函数

main.cc

#include "factory.h"
#include "shoes.h"
#include "car.h"int main(int argc, char** argv) {auto nike_shoes = ShoesFactory::Instance().Create("nike", 1);if (nike_shoes) {nike_shoes->Message();}auto anta_shoes = ShoesFactory::Instance().Create("anta", 2);if (nike_shoes) {anta_shoes->Message();}auto benz_car = CarFactory::Instance().Create("benz", 1, "small");if (nike_shoes) {benz_car->Message();}auto audi_car = CarFactory::Instance().Create("audi", 2, "big");if (nike_shoes) {audi_car->Message();}return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(test)set(CMAKE_CXX_STANDARD 11)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)add_executable(test main.cc factory.h register.h shoes.h nike.cc anta.cc car.h benz.cc audi.cc)

输出

1 Nike shoes !
2 Anta shoes !
1 small Benz car !
2 big Audi car !

基于模板的自动注册工厂模式(C++11实现)相关推荐

  1. 三步实现自动注册工厂替代switch语句(c++)

    概述 在学长博客里看到了使用自动注册工厂替代switch语句的文章,想到可以将其用到自己的项目里,就照猫画虎学习着也实现了一个. 这里并不是用其替代创建派生类的传统Factory,而是为了替代服务器中 ...

  2. TBar:重新访问基于模板的自动程序修复

    TBar:重新访问基于模板的自动程序修复 摘要 我们回顾了基于模板的APR的性能,以构建关于修复模式有效性的全面知识,并强调了补充步骤(如故障定位或提供者代码检索)的重要性.为此,我们首先对文献进行调 ...

  3. 自动注册工厂消灭switch-case

    之前在代码重构书中有了解过java中的反射机制可以消除switch-case,详情可以参考这篇博客http://blog.csdn.net/wwh578867817/article/details/4 ...

  4. 自定义springboot组件--基于模板模式对原生springboot的rabbitmq组件进行扩展

    一 引入 在我们的日常开发中,消息中间件已经成为了java研发工程师的一项必备技能,本文主要是基于对springboot原生组件的扩展开发,基于模板设计模式和静态代理模式,简化了队列路由的绑定,交由公 ...

  5. pyqt漂亮gui界面模板_一种基于模板的C代码自动生成方法

    在做C代码项目的时候,我们期望做到代码的高复用,高复用意味着代码的高配置性,即通过简单的配置修改达到复用代码的目的.如果代码高复用,支持灵活的配置,那么完全可以在上边做一个更简单的配置工具,用来修改代 ...

  6. 5 zabbix 添加host_运维监控实战篇,zabbix自动发现和自动注册图文详解

    一.介绍 自动发现 Zabbix自动发现就是为了解决批量监控而设计的功能之一,什么是自动发现呢,简单来说就是Zabbix Server端可以基于设定的规则,自动批量的去发现局域网若干服务器,并自动把服 ...

  7. zabbix 自动发现规则 触发器_运维监控实战篇,zabbix自动发现和自动注册图文详解...

    一.介绍 自动发现 Zabbix自动发现就是为了解决批量监控而设计的功能之一,什么是自动发现呢,简单来说就是Zabbix Server端可以基于设定的规则,自动批量的去发现局域网若干服务器,并自动把服 ...

  8. zabbix===》微信报警、聚合图形、自动发现自动注册、监控NFS、MySQL、web服务、URL地址

    一.企业微信号申请 https://work.weixin.qq.com/ 1.注册 因为我们没有企业,所以我们选择组织. 下一步, 按需填好相应信息 2.配置微信企业号 设置好相应信息,后记录下企业 ...

  9. CHAPTER 5 Zabbix 自动发现、自动注册、分布式监控、SNMP监控

    自动发现与自动注册 5.1 自动发现与自动注册 5.1.1 简介 5.1.2 两种模式 5.2 自动发现--被动模式 5.3 自动注册--主动模式 5.4 分布式监控 5.4.1 介绍 5.4.2 配 ...

最新文章

  1. android简单分享----文字加图片
  2. SQL语言学习(五)流程控制函数学习
  3. CSS布局最常用属性float(浮动)和position(定位)
  4. 洛谷2055 [ZJOI2009]假期的宿舍
  5. Netty工作笔记0050---Netty核心模块1
  6. 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
  7. 峰情万种_Enhancement of Peak Visual
  8. 麒麟ARM版:不能使用U盘安装,只能使用光盘
  9. Python 字典与集合
  10. 物联网传感技术——压电式传感器
  11. 基于视频/摄像头的简单行为动作识别模型的训练步骤
  12. MacBook下载的软件显示无法打开“某某某”,因为Apple无法检查其是否包含恶意软件。”的解决办法
  13. 最优化:拟牛顿法、最速下降法、共轭梯度法、信赖域法、协同优
  14. Excel如何批量重命名文件
  15. java将silk文件转换成MP3
  16. 原生js实现轮盘抽奖,控制中奖概率(完整示例)
  17. 5.Redis实战—秒杀业务
  18. tif批量转png格式 python
  19. 2013年CSDN高校俱乐部全国百所高校巡讲讲师招募
  20. hbase 启动时 Name or service not known -完美解决

热门文章

  1. Linux操作系统认识_01
  2. vue中target和eventTarget的区别
  3. 整理的jquery使用技巧
  4. 【JavaWeb】跨域问题的多种解决方案
  5. ZZULIOJ 2829: 闯关游戏
  6. 优秀的CAD看图软件VOW Desktop
  7. eNSP中RIP配置
  8. 【会当凌绝顶,一览众山小】一款低调奢华有内涵的终端工具: JoyfulPuTTY
  9. Unity 游戏实例开发集合 之 打砖块 休闲小游戏快速实现
  10. nginx反向代理后,java获取真实ip和解决request.getServerName()的问题