Language agnostic 单例编程的目的
诚然,这是一个相当松散的问题。我目前对单例的理解是,它们是一个类,您以一种只创建一个实例的方式设置它们 对我来说,这听起来很像一个静态类。主要区别在于,对于一个静态类,您不/不能实例化它,只需使用它,例如Language agnostic 单例编程的目的,language-agnostic,singleton,theory,Language Agnostic,Singleton,Theory,诚然,这是一个相当松散的问题。我目前对单例的理解是,它们是一个类,您以一种只创建一个实例的方式设置它们 对我来说,这听起来很像一个静态类。主要区别在于,对于一个静态类,您不/不能实例化它,只需使用它,例如Math.pi()。对于singleton类,您仍然需要执行以下操作 singleton firstSingleton = new singleton(); firstSingleton.set_name("foo"); singleton secondSingleton = new sing
Math.pi()
。对于singleton类,您仍然需要执行以下操作
singleton firstSingleton = new singleton();
firstSingleton.set_name("foo");
singleton secondSingleton = new singleton();
如果我错了,请纠正我,但是现在第一个单件==第二个单件,是吗
secondSingleston.set_name("bar");
firstSingleton.report_name(); // will output "bar" won't it?
请注意,我正在独立地询问这种语言,更多关于这个概念。因此,我并不担心如何编码这样的类,而是更多的为什么你不想去做什么,你需要考虑什么。 < P>不是所有的语言都有“静态类”(例如C++没有它们)。
再次使用C++实例,将静态变量添加到类中是一种痛苦,因为需要将它们放入头文件和.CPP文件中,因此,在这种情况下,单体非常有用。
每种语言都是不同的。我猜在C#中,它们不是很有用(事实上,据我所知,它们并不经常被使用)当您需要一个到单例服务的接口时,单例最有用,但您直到运行时才知道将实例化哪个具体类 例如,您可能希望声明一个中央日志记录服务,但只在运行时决定是挂接文件记录器、存根记录器、数据库记录器还是消息队列记录器
与由静态组成的类相比,单例的主要优点是,您可以在以后轻松地确定您实际上需要多个实例,例如,每个线程一个实例 然而,在实践中,单身人士的主要目的是让人们对拥有全局变量感觉不那么糟糕
一个很好地使用单例的实际例子是:你有一个使用SQL数据库的应用程序,你需要一个连接池。这样一个池的目的是重用DB连接,所以您肯定希望所有客户端都使用同一个池。因此,将其作为一个单体是正确的设计。但有一天,你需要该应用程序连接到第二台DB服务器,并意识到你不能连接到同一个池中的不同服务器。因此,您的“整体一个实例”单例将变成“每个DB服务器一个实例” 你为什么不想去 我不会,因为单身通常是解决问题的糟糕方法。我给你的建议是完全避免它们 主要原因是:
- 单身人士大多代表全球国家(这是邪恶的)
- 正确的依赖注入变得不可能
- 单例变量是另一个名称的全局变量
- 单身通常是个坏主意
- 单例可以被“monostate”类所取代,这些类显然具有正常的构造/销毁语义,但都共享相同的状态
如果不使用静态成员函数(或具有相同含义的某个静态工厂方法),而是将singleton对象传递给所有需要它的客户端,那么就不需要singleton模式,只需将相同的对象传递给所有客户端。除了其他答案,我必须说,当您需要静态类时,单例可以帮助您,但不能拥有它,因为由于应用程序的设计,它将继承一个可实例化类 一点知识是危险的,单身汉是危险的实体。除了上面写的东西之外,我可以强调单例对象的生命周期管理也很重要。在ACE框架中,它被成功地处理。你可以在这里找到报纸:
还请注意,Singleton应该是不可复制的类。这种模式似乎是最简单的,但恰恰相反,它是最困难的模式之一。因此,我向候选人询问单身人士的这一罪恶点 使用单例有两种方法
C++允许静态成员函数