可能重复:
单身人士有什么不好的?
可以理解的是,许多设计模式在某些情况下可能被滥用,就像妈妈总是说:" 太多好事并不总是好的! "
我注意到这些天,我经常使用Singletons,而且我担心自己可能会滥用设计模式,并且越来越深入地研究一种不良习惯的习惯.
我们正在开发一个Flex应用程序,当用户使用它时,该应用程序在内存中保留了相当大的分层数据结构.用户可以按需加载,保存,更改和刷新数据.
这些数据通过Singleton类集中,该类聚合了几个ArrayCollections,Arrays,value对象以及通过getter和setter公开的一些其他本机成员变量.
要从应用程序的任何位置获取对数据的引用,我们执行整个Model.getInstance()方法类型的事情,我确信每个人都熟悉.这确保了我们始终掌握相同的数据副本,因为在我们设计时,我们说在应用程序生命周期中只允许存在一次实例.
从这个中央数据存储库中,我们可以轻松地调度属性更改事件,并且可以有多个引用中央数据的UI组件,更新其显示以反映已发生的数据更改.
到目前为止,这种方法已经有效并且证明对我们的环境非常实用.
然而,我发现,在创建新课程时,我有点过分了.问题应该是一个类是Singleton,还是应该以其他方式管理,例如可能使用工厂,往往有点变得有点困难,有点不确定.
我在哪里画单线?是否有一个很好的指导方针来决定何时使用单身人士以及何时远离他们.
另外,有人可以推荐一本关于设计模式的好书吗?
我最近几天一直在阅读关于Singleton模式的文章.一般认为,需要它的场景很少(如果不是很少见),可能是因为它有一些问题,例如
我开始了解这些问题背后的想法,但不完全确定这些问题.就像垃圾收集问题一样,在单例实现中使用静态(这是模式固有的),是关注点吗?因为这意味着静态实例将持续到应用程序.它是否会降低内存管理(它只是意味着分配给单例模式的内存不会被释放)?
当然,在多线程设置中,让所有线程都争用单例实例将是一个瓶颈.但是这种模式的使用如何导致同步问题(当然我们可以使用互斥或类似的东西来同步访问).
从(单元?)测试的角度来看,由于单身人士使用静态方法(很难被模拟或存根),他们可能会导致问题.对此不确定.有人可以详细说明这个测试问题吗?
谢谢.
假设我们需要在项目中只有一个类的一个实例.有几种方法可以做到这一点.
我想比较一下.请你复习一下我的理解.
1)古典单身模式
2)完全静态类(所有方法和成员都是静态的).
据我所知,差异如下:
a)未定义跨不同单元的静态成员的初始化顺序.因此,完全静态成员初始化不能使用来自其他模块的任何静态成员/函数.而单身人士没有这个问题.
b)我们必须处理Singleton的getInstance()的线程.但是,完全静态类没有这个问题.
c)访问方法看起来有点不同.FOO ::巴(); vs Foo :: getInstance() - > bar(); 通常,singleton可以返回NULL来识别构造对象时存在一些问题而静态类不能.
d)对于静态类的一堆静态,类的定义看起来有点笨拙.
我错过了什么吗?
class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
}
Run Code Online (Sandbox Code Playgroud) 好吧,所以我有一个情况,我调用LoadLibrary我写的DLL.对LoadLibrary的此调用将返回错误#998或ERROR_NOACCESS"对内存位置的无效访问".
有问题的DLL在一种配置中使用MFC,而在另一种配置中不使用; 只有MFC配置有这个问题.它曾经工作,但我不知道我改变了什么:我实际上转向了非MFC版本,并且一直在修补它,我不知道我能做些什么影响了MFC版本.
我不太了解DLL.原来的加载代码实际上是给我的,我没有改变它.以下是该代码:
// submodule loading
#ifndef MFC
// Project uses standard windows libraries, define an entry point for the DLL to handle loading/unloading
BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
_MESSAGE("DllMain called.");
switch(dwReason)
{
case DLL_PROCESS_ATTACH: // dll loaded
hModule = (HMODULE)hDllHandle; // store module handle
_MESSAGE("Attaching Submodule ...");
break;
case DLL_PROCESS_DETACH: // dll unloaded
_MESSAGE("Detaching Submodule ...");
break;
}
return true;
}
#else
// Project uses MFC, we define …Run Code Online (Sandbox Code Playgroud) 我知道单例只允许一个对象的一个实例。单例中声明的每个方法都只会对该对象进行操作。我想知道为什么不简单地声明一个可以实现相同目标的全局对象?
我肯定忘记了什么。如果单例存在,则必须有特定的用途或有助于实现特定的机制。
例如:
class Singleton
{
public:
static Singleton& Instance()
{
static Singleton sg;
return sg;
}
void function();
};
Run Code Online (Sandbox Code Playgroud)
将与以下相同:
class NotSingleton
{
public:
NotSingleon();
~NotSingleton()
void function();
};
NotSingleton nsg;
Run Code Online (Sandbox Code Playgroud)
但是,没有什么可以阻止我使用多个实例NotSingleton
从一开始C++用户的角度来看,我看到单例类有用的唯一原因与我想要使用静态变量时类似.你们知道什么时候最适合使用单身人士课程吗?
好吧,我读单身是坏的,因为他们是反模式.我还读到,主要原因是全局对单身人士的引用,无论如何:
是否总能避免单身?
如果是这样,让我们举例说,我有一个IOCP网络,我需要初始化一次,这个对象需要在整个软件生命周期内保持不变.同样的是我称之为"paint"的类,我将数据打印到屏幕上.如果我没有单独使用它,我仍然需要当前Hwnd的全局变量,并在每次我要使用它时本地初始化对象(真的很烦人).
所以使用单身是我的设计缺陷的标志吗?我该怎么做才能避免它们?
谢谢.