限制类实例化

时间:2018-08-29 09:14:44

标签: c# instantiation encapsulation

在C#中,有没有一种方法可以停止实例化类,例如在'n'个实例化之后说呢?这个link并没有太大帮助。

关于尝试事情,我正在考虑使类静态化,但是  在停止实例化之前,必须先实现“ n”个实例化。通过反射有可能吗?

2 个答案:

答案 0 :(得分:2)

您可能有一个私有静态计数器,在构造函数中对其进行递增,如果达到限制,则抛出异常。但是请注意,这是一个非常奇怪的设计,很可能是糟糕的设计。 更好的方法是使用工厂模式

class LimitedInstantiation
    {
        private static int instCounter = 0;
        public LimitedInstantiation()
        {
            instCounter++;
            // limit your number of instances 
            if (instCounter > 3)
            {
                throw new Exception("Limit of instances reached");
            }
        }

        ~LimitedInstantiation()
        {   
            // Reduce your number of instances in the destructor
            instCounter--;
        }
    }

您可以测试是否这样:

try
{
    var instance1 = new LimitedInstantiation();
    var instance2 = new LimitedInstantiation();
    var instance3 = new LimitedInstantiation();
    // this should fail.
    var instance4 = new LimitedInstantiation();
}
catch (Exception e)
{
    Console.WriteLine(e);
}

答案 1 :(得分:1)

您可以使用类似于单例模式的模式(除了我们允许多个实例):

public sealed class LimitedInstantiationsClass
{
    private const int _maxInstantiations = 5;
    private static int _instantiations = 0;
    private static object _lockObject = new object();

    private LimitedInstantiationsClass()
    {
    }

    public static bool TryGetInstance(out LimitedInstantiationsClass instance)
    {
        instance = null;
        if (_instantiations >= _maxInstantiations)
        {
            return false;
        }
        lock (_lockObject)
        {
            if (_instantiations >= _maxInstantiations)
            {
                return false;
            }
            ++_instantiations;
        }
        instance = new LimitedInstantiationsClass();
        return true;
    }
}

本质上,因为构造函数是私有的,所以只有TryInstance方法可以创建class *的实例。在课程中,我们私下跟踪提供的实例数。锁定代码是为了确保此方法是线程安全的,因此我们将提供的最大值是_maxInstantiations(5)。

我们两次检查_instantiations >= _maxInstantiations的原因是,这可能在第一次检查和获取锁之间发生变化。我们将在外部进行测试,以避免在无法创建更多实例的情况下获得锁的成本。

TryInstance将在达到限制后返回false。

**您仍然可以使用Reflection在其他位置创建一个对象,但是几乎可以使用任何方法来实现。

Try it online

相关问题