首页 > 其他分享 >设计模式-简单工厂

设计模式-简单工厂

时间:2023-02-19 14:34:26浏览次数:36  
标签:std 设计模式 void 工厂 className static 简单 ImplHelper include

api.h

#pragma once
#include<string>
#include<iostream>

class API {

public:
	virtual void run(std::string) = 0;

protected:

	API() {};
};


class BAPI : public API {

public:
	virtual void run(std::string str)override {

		std::cout << "BAPI:" << str << std::endl;
	}

};


class PAPI : public API {

public:
	virtual void run(std::string str) override {

		std::cout << "PAPI:" << str << std::endl;
	}

};



class Factory {

	inline static API* createAPI(int type) {

		if (type == 0)return new BAPI();
		if (type == 1)return new PAPI();
	}
};

Dyobj.h

#pragma once
#ifndef DYNOBJ
#define DYNOBJ	
#include<string>
#include<map>
#include "API.h"

typedef void*  (*Constructor)();

class CObjectFactor {
public:
	static void registerClass(std::string className, Constructor constructor) {

		constructors()[className] = constructor;
	}

	static void* createObject(std::string className) {
		Constructor constructor = nullptr;
		if (constructors().find(className)!= constructors().end())
		{
			constructor = constructors().find(className)->second;
		}
		if (constructor == NULL)
		{
			return NULL;
		}
		return constructor();
	}
private:
	inline static std::map<std::string, Constructor>& constructors() {
		static std::map<std::string, Constructor> instance;
		return instance;
	}
};



/*
class ImplHelper {
public:
	ImplHelper() {
		CObjectFactor::registerClass("BAPI", ImplHelper::createObjFunc);
	}
	static void* createObjFunc() {
		return new BAPI();
	}
};
*/

#define REGISTER_CLASS(className)\
class className##ImplHelper {\
public:\
	className##ImplHelper() {\
		CObjectFactor::registerClass(#className, className##ImplHelper::createObjFunc);\
	}\
	static void* createObjFunc() {\
		return new className();\
	}\
};\
className##ImplHelper className##Helper;


#endif // !DYNOBJ

main.cpp

#include<iostream>
#include<string>

#include "DynObj.h"
#include "API.h"

REGISTER_CLASS(PAPI);
REGISTER_CLASS(BAPI);


int main(int argc, char** argv) {

	BAPI* p1 = static_cast<BAPI*>(CObjectFactor::createObject("BAPI"));
	PAPI* p2 = static_cast<PAPI*>(CObjectFactor::createObject("PAPI"));
	
	p1->run("dddddd");
	p2->run("dddd");

	delete p1;
	delete p2;

	return 0;

}

标签:std,设计模式,void,工厂,className,static,简单,ImplHelper,include
From: https://www.cnblogs.com/xcodingfork/p/17134700.html

相关文章

  • 设计模式-原型模式
    原型模式(PrototypePattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式应用实例描述如下:未使用原型模式#inc......
  • 设计模式-建造者模式
    业务场景未使用建造者模式实现#include<iostream>#include<string>#include<vector>#include<sstream>usingnamespacestd;template<classT>stringConvertTo......
  • tsup 简单快速的typescript库打包工具
    tsup是一个很不错的工具,可以方便的进行typescript应用打包以及构建,支持了灵活的资源加载处理tsx也是一个不错的工具,可以进行dev模式的处理tsup参考配置tsup.confi......
  • 软件测试|超好用超简单的Python GUI库——tkinter
    前言如果我们想要使用Python创建一个GUI界面,我们应该使用哪个库?Python有没有实现这个功能的库?答案是肯定的,Python的库这么多,肯定有实现上述功能的库,那么我们应该使用哪一......
  • 简单工厂模式
     packagecom.mhm.simplefactory;/****@authorAdministrator*@描述抽象产品角色*/publicinterfaceCar{publicvoiddrive();}packagecom.mhm.simplefactory......
  • 软件测试|测试开发之路--UI 自动化常用设计模式
    接上一次的帖子,今天讲一下我再UI自动化中常用的设计模式。由于网上已经有非常多的文章详细讲解了设计模式的编码实现,所以我今天也就不讲实现细节了。就是讲我也讲不出什......
  • Spring AOP annotation 简单实例
    最后输出(可以看出各种通知的时间): 我是前置通知。我是环绕--进。aa已成功保存我是后置通知。我是最终通知。我是环绕--出。 app.xml:<?xmlversion="1.0"encoding......
  • 一段简单的对TXT文件的操作代码
    1stringtxt=@"C:\DetectFolder\IPV4地址.txt";2stringpath="";34if(File.Exists(txt)){}//检测是否存在text文......
  • php 运用设计模式:观察者模式,设计电商平台支付成功程序|Github仓库
    前(fei)言(hua)在支付程序中,大型项目的维护,如果没有运用到设计模式,面向过程的编程,order程序会日益增加,程序看上去杂乱无章,今天写了一个小demo,之前没有运用过观察者模式的小伙......
  • 简单的猜拳游戏-JAVA实现
    一个简单的猜拳游戏packagecom.zhou.java.demo02;importjava.util.Random;importjava.util.Scanner;publicclassDemo09{publicstaticvoidmain(String[]args......