我有一个监视器类,它通过一个静态函数来访问它自身的实例。当调用GetMonitor时,将搜索mMonitors映射并返回实例,如果实例不存在,则创建该实例。
class Monitor {
public:
static Monitor& GetPrimaryMonitor();
static Monitor& GetMonitor(int number = 0);
int GetXResolution();
int GetYResolution();
void SetXResolution(int resolution);
void SetYResolution(int resolution);
protected:
private:
Monitor(int number);
static std::map<int, Monitor*> mMonitors;
};我的问题是,我应该在什么时候删除地图中保存的Monitor实例?或者我应该采取一种不同的方法,允许用户创建他/她想要的任意数量的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法提供了对已经可用的共享资源的访问。先谢谢你,艾尔。
发布于 2011-08-25 01:24:43
我应该采取一种不同的方法,允许用户创建他/她想要的任意数量的监视器实例吗?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法提供了对已经可用的共享资源的访问
是的,你绝对应该这样做。出于几个原因:
对应的
发布于 2011-08-25 01:28:30
我建议远离单例,特别是如果它们是用静态实现的。这种模式的含义一开始并不明显,但可能会使事情变得复杂(例如,如果您有多个二进制文件、DLL、关心特定的销毁顺序等)。
您应该尝试重新设计,以便可以在代码中传递此Monitor实例(某种依赖注入),而不是将其作为单例(实际上,这是OO中滥用最多的模式)。
发布于 2011-08-25 01:17:36
您不需要删除监视器的实例(考虑到您不会有那么多监视器设备连接到您的系统,这不是问题)。但如果你真的想这样做,你可以在它们各自的设备断开连接后立即删除它们。
关于实例的创建,您可以保持相同的方法。您可以在用户请求新对象(1)或连接新的监视器设备时(2)实例化新对象。如果可以将监控设备连接到系统,但在您的应用程序上下文中什么也不做,我会使用(1)。另一方面,如果每次新的监视器设备连接到系统时,您的应用程序都需要获得设备的分辨率,我会使用(2)。
https://stackoverflow.com/questions/7179312
复制相似问题