Singleton:两全其美(希望实例化类)

本文关键字:实例化 希望 两全其美 Singleton | 更新日期: 2023-09-27 18:00:09

使用此代码:

public class MyClass
{
    public int Number;
    private static MyClass myClass;
    ...
    public MyClass GetInstance()
    {
        ...
        return myClass;
    }
}

我有没有办法支持以下两种说法?

MyClass.Number = 5;

其中MyClass检索用于存储Number 值的静态类

MyClass myLocalClass = new MyClass();

或者是一种脱离Singleton设计模式的替代方案,因为我也希望能够创建一个实例。

谢谢你的光临!

Singleton:两全其美(希望实例化类)

您想要的是MonoState模式。我将引用Robert C.Martin 的Agile Principles, Patterns, and Practices in C#

MONOSTATE模式是实现奇异性的另一种方式。它有效通过完全不同的机制。

第一个测试函数简单地描述了一个对象,其x变量可以设置和检索。但是第二个测试案例显示同一类的实例表现得好像它们是一体的。如果你设置将一个实例上的x变量转换为特定值,您可以检索通过获取不同实例的x变量来获取该值。它就像尽管这两个实例只是同一个实例的不同名称对象

因此,您可以实例化2个或多个类,但它们将共享相同的值。

下面是一个实现示例:

public class Monostate
{
    private static int itsX;
    public int X
    {
        get { return itsX; }
        set { itsX = value; }
    }
}

还有测试,所以你可以看到它是如何使用的:

using NUnit.Framework;
[TestFixture]
public class TestMonostate
{
    [Test]
    public void TestInstance()
    {
        Monostate m = new Monostate();
        for (int x = 0; x < 10; x++)
        {
            m.X = x;
            Assert.AreEqual(x, m.X);
        }
    }
    [Test]
    public void TestInstancesBehaveAsOne()
    {
        Monostate m1 = new Monostate();
        Monostate m2 = new Monostate();
        for (int x = 0; x < 10; x++)
        {
            m1.X = x;
            Assert.AreEqual(x, m2.X);
        }
    }
}

您想要的只是一个静态成员。根据定义,Singleton只有一个实例,这意味着你不能显式地实例化它

你的课应该是

public class MyClass
{
    public static int Number;
}

但是,除非您也有一些非静态成员,否则创建类的多个实例是毫无意义的。