如何创建不同类型的对象池

本文关键字:同类型 对象 何创建 创建 | 更新日期: 2023-09-27 18:23:57

我正在尝试创建一个对象池,该对象池将具有不同类型的对象。

有可能吗,如果我把一个字符串作为ps参数传递给RetriveFunction();它应该创建一个字符串类型的新对象,还是从池中删除它?

字符串将包含类型的名称。

例如;

    Object RetriveFromPool(string typename)
    {
          if()//object does not present
           {
               //return new object of typename
           }
          else
           {
               //feth it from pool
           }
     }

有可能吗?

如何创建不同类型的对象池

是的,这是可能的。Dictionary是通过O(1)查找存储键值对的一种方便方式,Activator能够实例化一种仅在运行时已知的类型:

private IDictionary<string, object> _objectPool;
object RetriveFromPool(string typeName)
{     
    if(_objectPool.ContainsKey(typeName))
    {
        return _objectPool[typename]; // return from the pool
    }
    return Activator.CreateInstance(Type.GetType(typeName)); // Try to create a new object using the default constructor
 }

然而,作为一种替代方案(为了确保编译时类型检查),您可能希望使用泛型来实现这一点:

private IDictionary<Type, object> _objectPool;
public T RetrieveFromPool<T>() where T : new() 
{
  Type type = typeof(T);
  return _objectPool.ContainsKey(type) ? (T)_objectPool[type] : new T();
}
// Update - add a couple of templates for add methods:
public void AddToPool<T>() where T : new
{
  _objectPool[typeof(T)] = new T();
}
public void AddToPool<T>(T poolObject) where T : new
{
  _objectPool[typeof(T)] = poolObject;
}

如果您的类型在compiletime是已知的,那么您最好使用泛型:

IDictionary<Type, object> Pool = new Dictionary<Type, object>();
T RetrieveFromPool<T>()
    where T : new()
{
    if (Pool.ContainsKey(typeof(T)))
    {
        return Pool[typeof(T)];
    }
    return Pool[typeof(T)] = new T();
}

以下是我可以设计的使用字符串/反射的最安全的方法:

IDictionary<string, object> Pool = new Dictionary<string, object>();
object RetrieveFromPool(string typeName)
{
    if (Pool.ContainsKey(typeName))
    {
        return Pool[typeName];
    }
    Type type = Type.GetType(typeName);
    if (type == null)
    {
        return null;
    }
    ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
    if (ctor == null)
    {
        return null;
    }
    object obj = ctor.Invoke(new object[0]);
    Pool[typeName] = obj;
    return obj;
}