ModernCPlusPlusDemo
载入中...
搜索中...
未找到
ObjectFactory.hpp
浏览该文件的文档.
1#pragma once
2
3#include <any>
4#include <functional>
5#include <iostream>
6#include <memory>
7#include <stdexcept>
8#include <string>
9#include <typeindex>
10#include <unordered_map>
11#include <vector>
12
13#include "Singleton.hpp"
14
15class ObjectFactory : public Singleton<ObjectFactory>
16{
17 friend class Singleton<ObjectFactory>;
18
19public:
20 template<typename T, typename... Args>
21 T* create(Args&&... args)
22 {
23 return createImpl<T>(typeid(T).name(), std::forward<Args>(args)...);
24 }
25
26 template<typename T, typename... Args>
27 T* createByName(const std::string& typeName, Args&&... args)
28 {
29 return createImpl<T>(typeName, std::forward<Args>(args)...);
30 }
31
32 template<typename T>
33 void registerType(const std::string& typeName)
34 {
35 m_typeInfo[typeName] = TypeInfo{
36 std::type_index(typeid(T)), [this](std::any args) -> std::unique_ptr<void, Deleter>
37 { return std::unique_ptr<void, Deleter>(new T(std::any_cast<decltype(args)>(args)), Deleter{this}); },
38 [](void* ptr) { delete static_cast<T*>(ptr); }};
39 }
40
41 template<typename T>
42 std::vector<T*> getObjects() const
43 {
44 std::vector<T*> result;
45 for (const auto& pair : m_objects)
46 {
47 if (pair.second.typeIndex == std::type_index(typeid(T)))
48 {
49 result.push_back(static_cast<T*>(pair.second.ptr.get()));
50 }
51 }
52 return result;
53 }
54
55 void deleteObject(void* ptr)
56 {
57 auto it = std::find_if(m_objects.begin(), m_objects.end(),
58 [ptr](const auto& pair) { return pair.second.ptr.get() == ptr; });
59 if (it != m_objects.end())
60 {
61 m_objects.erase(it);
62 }
63 }
64
66 {
67 std::cout << "ObjectFactory destructor: Cleaning up all objects." << std::endl;
68 m_objects.clear();
69 }
70
71private:
72 struct Deleter
73 {
75
76 void operator()(void* ptr) const
77 {
79 }
80 };
81
83 {
84 std::unique_ptr<void, Deleter> ptr;
85 std::type_index typeIndex;
86 std::function<void(void*)> deleter;
87 };
88
89 struct TypeInfo
90 {
91 std::type_index typeIndex;
92 std::function<std::unique_ptr<void, Deleter>(std::any)> creator;
93 std::function<void(void*)> deleter;
94 };
95
96 std::unordered_map<std::string, TypeInfo> m_typeInfo;
97 std::unordered_map<void*, ObjectInfo> m_objects;
98
99 template<typename T, typename... Args>
100 T* createImpl(const std::string& typeName, Args&&... args)
101 {
102 auto it = m_typeInfo.find(typeName);
103 if (it == m_typeInfo.end())
104 {
105 throw std::runtime_error("Unknown type: " + typeName);
106 }
107
108 auto any_args = std::make_any<decltype(std::make_tuple(std::forward<Args>(args)...))>(
109 std::make_tuple(std::forward<Args>(args)...));
110 auto unique_ptr = it->second.creator(any_args);
111 T* ptr = static_cast<T*>(unique_ptr.get());
112 m_objects[ptr] = ObjectInfo{std::move(unique_ptr), std::type_index(typeid(T)), it->second.deleter};
113 return ptr;
114 }
115
116 ObjectFactory() = default;
117};
118
119//===========================Usage example=========================================
120// // main.cpp
121// #include "ObjectFactory.hpp"
122// #include <iostream>
123// #include <memory>
124
125// // Base class for animals
126// class Animal
127// {
128// public:
129// virtual ~Animal() = default;
130// virtual void makeSound() const = 0;
131// };
132
133// // Dog class
134// class Dog : public Animal
135// {
136// public:
137// Dog(const std::string& name) : m_name(name) {}
138// void makeSound() const override
139// {
140// std::cout << m_name << " says: Woof!" << std::endl;
141// }
142// private:
143// std::string m_name;
144// };
145
146// // Cat class
147// class Cat : public Animal
148// {
149// public:
150// Cat(const std::string& name, int lives) : m_name(name), m_lives(lives) {}
151// void makeSound() const override
152// {
153// std::cout << m_name << " says: Meow! (Lives left: " << m_lives << ")" << std::endl;
154// }
155// private:
156// std::string m_name;
157// int m_lives;
158// };
159
160// int main()
161// {
162// // Get the singleton instance of ObjectFactory
163// ObjectFactory& factory = ObjectFactory::Instance();
164
165// // Register types
166// factory.registerType<Dog>("Dog");
167// factory.registerType<Cat>("Cat");
168
169// try
170// {
171// // Create objects
172// Dog* dog = factory.createByName<Dog>("Dog", "Buddy");
173// Cat* cat = factory.createByName<Cat>("Cat", "Whiskers", 9);
174
175// // Use the objects
176// dog->makeSound();
177// cat->makeSound();
178
179// // Get all animals and make them sound
180// std::cout << "\nAll animals:" << std::endl;
181// for (Animal* animal : factory.getObjects<Animal>())
182// {
183// animal->makeSound();
184// }
185
186// // Try to create an unregistered type
187// factory.createByName<Animal>("Bird", "Tweety");
188// }
189// catch(const std::exception& e)
190// {
191// std::cerr << "Error: " << e.what() << std::endl;
192// }
193
194// // The factory will automatically delete the objects when it's destroyed
195
196// return 0;
197// }
Definition ObjectFactory.hpp:16
~ObjectFactory()
Definition ObjectFactory.hpp:65
T * create(Args &&... args)
Definition ObjectFactory.hpp:21
std::unordered_map< void *, ObjectInfo > m_objects
Definition ObjectFactory.hpp:97
void registerType(const std::string &typeName)
Definition ObjectFactory.hpp:33
std::vector< T * > getObjects() const
Definition ObjectFactory.hpp:42
std::unordered_map< std::string, TypeInfo > m_typeInfo
Definition ObjectFactory.hpp:96
ObjectFactory()=default
T * createImpl(const std::string &typeName, Args &&... args)
Definition ObjectFactory.hpp:100
T * createByName(const std::string &typeName, Args &&... args)
Definition ObjectFactory.hpp:27
void deleteObject(void *ptr)
Definition ObjectFactory.hpp:55
Definition Singleton.hpp:5
Definition ObjectFactory.hpp:73
ObjectFactory * factory
Definition ObjectFactory.hpp:74
void operator()(void *ptr) const
Definition ObjectFactory.hpp:76
Definition ObjectFactory.hpp:83
std::type_index typeIndex
Definition ObjectFactory.hpp:85
std::unique_ptr< void, Deleter > ptr
Definition ObjectFactory.hpp:84
std::function< void(void *)> deleter
Definition ObjectFactory.hpp:86
Definition ObjectFactory.hpp:90
std::type_index typeIndex
Definition ObjectFactory.hpp:91
std::function< void(void *)> deleter
Definition ObjectFactory.hpp:93
std::function< std::unique_ptr< void, Deleter >(std::any)> creator
Definition ObjectFactory.hpp:92