4

我正在做一个项目,其中一个共同开发人员(和以前的开发人员)对几乎每个内部有很多方法调用的类页面使用单例/外观,但实际上并没有维护数据。

例如:

public class FooFacade
{
    private static FooFacade m_facade = null;
    private static DataAccessManager m_dataAccessMgr = null;

    public StringBuilder Status {get; set; }

    private FooFacade()
    {
        this.Status = new StringBuilder();
    }

    public static FooFacade getInstance()
    {
        if (m_facade == null)
        {
            m_dataAccessMgr = DataAccessManager.getInstance();
            m_facade = new FooFacade();
        }

        return m_facade;
    }

    public void clearStatus()
    {
        this.Status.Remove(0, Status.Length);
    }

 public void Method1(string value1, int value2)
    {
     // DO SOMETHING
    }


 public List<string> Method2(string value1, int value2)
    {
     // DO SOMETHING ELSE
     // RETURN LIST
    }

现在,我对命名约定以及他们将 Singelton 与 Facade 放在同一个类中以及 Facade 并不是真正的 Facade 的事实存在某些问题。(但那是完全不同的对话)。

所以我的问题是这是否真的有好处。开发人员可以解释的最好的一点是,它对内存管理更好,因为您不需要不断地创建和处置对象。

我们的应用程序不是企业级应用程序,我们没有内存问题。任何时候网站速度都很慢,这实际上是由于数据库而不是代码。

谢谢你的帮助。我是一个喜欢知道为什么要让自己成为更好的开发者的开发者。由于我无法从开发人员那里得到有意义的话,所以我正在与你们联系。

谢谢,乍得

更新 感谢下面的评论,我知道状态是一个严重的问题,因为它有可能成为一个巨大的安全漏洞。在内存管理、速度等方面,在单例中使用此代码有什么好处吗?或者每次我需要它时实例化 FooFacade 会更容易吗?

4

3 回答 3

6

因为你的对象有一个内部状态 ( Status) 你在自找麻烦。具体来说,如果在多个线程中(例如在 Web 应用程序中)使用单例,则代码可能无法正常工作。

仅当您的类没有内部状态时才使用单例。

于 2012-01-09T18:53:19.113 回答
2

在内存管理、速度等方面,在单例中使用此代码有什么好处吗?或者每次我需要它时实例化 FooFacade 会更容易吗?

这种类型的实例包含的所有内容都是对 a 的引用StringBuilder。此外,创建新实例时不会进行繁重的工作(除非DataAccessManager.getInstance()在幕后做了一些讨厌的事情)。所以不,在内存管理、速度等方面没有明显的好处。我只会在需要时实例化一个新实例。(或者更确切地说:我会尝试完全摆脱这个类......)

于 2012-01-09T21:46:55.450 回答
1

我会将单例模式保存为必须作为单例存在的事物,例如在多个消费者之间共享的特定文件。单例通常涉及隔离线程问题。但是,如果您有一个不包含任何状态并使用单例模式实现的类,那么您已经实现了一个很容易成为反模式的实用程序类。虽然不是一个好主意,但作为具有静态方法的静态类会更高效。静态方法无需在调用方法之前进行空检查。但正如我在开始时所说,将单例模式留给必须是单例的事物。

于 2012-01-09T21:59:44.213 回答