Singleton:两全其美(想要实例化课程)

时间:2014-04-26 01:03:17

标签: c# singleton

使用此代码:

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设计模式的替代方案,因为我希望能够创建一个实例。

感谢您的期待!

2 个答案:

答案 0 :(得分:1)

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

你的课应该只是。

public class MyClass
{
    public static int Number;
}

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

答案 1 :(得分:1)

您正在寻找的是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);
        }
    }
}