C++工厂模式如何避免if...else...选择不同的工厂对象
时间: 2024-09-10 19:19:18 浏览: 41
C++工厂模式通常使用单例或享元模式来避免过多的`if...else...`条件判断,创建不同的对象实例。下面是两个例子:
1. **使用单例模式**:
创建一个工厂类作为单例,维护一个映射表(例如关联数组或哈希表),其中键是某种类型的标识符,值是对应的工厂函数:
```cpp
class Factory {
private:
static Factory* instance;
Factory() {}
public:
// 静态方法获取唯一实例
static Factory* getInstance() {
if (!instance) {
instance = new Factory();
}
return instance;
}
// 使用模板方法创建对象,减少if...else...
template <typename T>
T createObject() {
return static_cast<T>(objects[T::type()]);
}
// 用于存储对象类型及其对应工厂函数
struct ObjectType {
static int type();
// 对应的具体创建函数
static T createInstance();
};
};
// ...然后在需要的地方,直接通过Factory::getInstance().createObject<Type>()得到对象
```
2. **使用享元模式**:
如果工厂创建的对象有大量相同的实例,可以考虑使用享元模式,通过一个池来复用对象。这样可以减少创建新的对象次数,进而消除`if...else...`:
```cpp
class SingletonPool {
private:
std::map<int, std::unique_ptr<MyObject>> objects;
public:
MyObject* getObject(int id) {
auto it = objects.find(id);
if (it != objects.end()) {
return it->second.get();
} else {
auto obj = std::make_unique<MyObject>();
objects[id] = std::move(obj);
return obj.get();
}
}
};
// 在客户端,只需传入id即可
SingletonPool pool;
MyObject* obj = pool.getObject(someId);
```
这两种方式都可以简化代码,让工厂的选择过程更简洁。
阅读全文