IOC容器

1、什么是IOC

(1)即:控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理

(2)使用IOC目的:为了降低耦合度

(3)上篇文章中的Spring快速上手就是IOC实现

IOC容器_第1张图片

 

 

#include 
#include 
#include 
#include 
#include 
using namespace std;

template 
class IocContainer {
public:
	IocContainer(void) {}
	~IocContainer()
	{}
	//注册需要创建对象的构造函数,通过一个唯一的标识,以便于以后查找
	//用函数包装器包装一个构造函数,注册到map中
	template
	void RegisterType(string strKey) 
	{
		std::function function = [] {return new T(); };
		RegisterType(strKey, function);
	}

	//根据唯一的标识去查找对应的构造函数
	T* Resolve(string strKey) {
		if (m_createMap.find(strKey) == m_createMap.end())
			return nullptr;
		std::function function = m_createMap[strKey];
		return function();
	}

	//创建智能指针
	std::shared_ptr ResolveShared(string strKey) {
		T* ptr = Resolve(strKey);
		return std::shared_ptr(ptr);
	}
private:
	void RegisterType(string strKey, std::function creator) {
		if (m_createMap.find(strKey) != m_createMap.end()) {
			throw std::invalid_argument("已经存在这个key了");
		}
		m_createMap.emplace(strKey, creator);
	}

private:
	map> m_createMap;
};

struct ICar {
	virtual ~ICar() {}
	virtual void test() const = 0;
};

struct Bus : ICar
{
	Bus() {}
	void test()const { std::cout << "Bus::test()" << endl; }
};

struct Track :ICar {
	Track() {};
	void test() const { std::cout << "Track::test" << endl; }

};

int main65443534() {
	IocContainer carIOC;
	carIOC.RegisterType("bus");
	carIOC.RegisterType("track");

	std::shared_ptr bus = carIOC.ResolveShared("bus");
	bus->test();
	std::shared_ptr track = carIOC.ResolveShared("track");
	track->test();
	system("pause");

	return 0;
}

你可能感兴趣的:(设计模式,c++,算法,数据结构)