Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 单例编程的目的_Language Agnostic_Singleton_Theory - Fatal编程技术网

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#中,它们不是很有用(事实上,据我所知,它们并不经常被使用)

当您需要一个到单例服务的接口时,单例最有用,但您直到运行时才知道将实例化哪个具体类

例如,您可能希望声明一个中央日志记录服务,但只在运行时决定是挂接文件记录器、存根记录器、数据库记录器还是消息队列记录器

  • Singleton是全局变量的一个非常有用的替代品,可以在整个代码中使用。
  • 单例通常不是“新建”ed或“删除”d,它们往往在首次使用时初始化,并随程序范围一起删除
  • 单例完全适合包装日志、配置和其他硬件接口类

  • 与由静态组成的类相比,单例的主要优点是,您可以在以后轻松地确定您实际上需要多个实例,例如,每个线程一个实例

    然而,在实践中,单身人士的主要目的是让人们对拥有全局变量感觉不那么糟糕


    一个很好地使用单例的实际例子是:你有一个使用SQL数据库的应用程序,你需要一个连接池。这样一个池的目的是重用DB连接,所以您肯定希望所有客户端都使用同一个池。因此,将其作为一个单体是正确的设计。但有一天,你需要该应用程序连接到第二台DB服务器,并意识到你不能连接到同一个池中的不同服务器。因此,您的“整体一个实例”单例将变成“每个DB服务器一个实例”

    你为什么不想去

    我不会,因为单身通常是解决问题的糟糕方法。我给你的建议是完全避免它们

    主要原因是:

    • 单身人士大多代表全球国家(这是邪恶的)
    • 正确的依赖注入变得不可能
    我建议你在谷歌员工的博客中阅读以下内容(包括详尽的解释):

    正如其他人所说:

    • 单例变量是另一个名称的全局变量
    • 单身通常是个坏主意
    • 单例可以被“monostate”类所取代,这些类显然具有正常的构造/销毁语义,但都共享相同的状态
    请注意,在我看来,“静态类”通常也是一个坏主意,对于不允许自由函数的语言来说,这是一种黑客的解决方法,或者对于在一组函数之间共享状态而不希望将该状态作为参数传递的语言来说,这是一种黑客的解决方法

    根据我的经验,几乎所有带有单例或静态类的设计都可以通过去掉这些结构而变得更好、更容易理解和更灵活

    编辑:根据请求,为什么大多数单例都是另一个名称的全局变量

    在我所知道的大多数语言中,大多数单例类都是通过该类的静态成员函数访问的。单个实例可供所有访问singleton类定义的代码使用。这是一个全局变量-包含该类的所有代码都可能会修改singleton的单个实例。

    如果不使用静态成员函数(或具有相同含义的某个静态工厂方法),而是将singleton对象传递给所有需要它的客户端,那么就不需要singleton模式,只需将相同的对象传递给所有客户端。

    除了其他答案,我必须说,当您需要静态类时,单例可以帮助您,但不能拥有它,因为由于应用程序的设计,它将继承一个可实例化类

    一点知识是危险的,单身汉是危险的实体。除了上面写的东西之外,我可以强调单例对象的生命周期管理也很重要。在ACE框架中,它被成功地处理。你可以在这里找到报纸:


    还请注意,Singleton应该是不可复制的类。这种模式似乎是最简单的,但恰恰相反,它是最困难的模式之一。因此,我向候选人询问单身人士的这一罪恶点

    使用单例有两种方法

  • 应该如何使用它们。通常使用不可变变量(C#的String.Empty、Smalltalk中的类等)。这大约是单例使用量的1%
  • 作为全局变量的替换。这很糟糕。造成这种情况的根本原因是人们希望共享公共对象,而不了解如何正确使用构建器。以这种方式使用单例通常是对面向对象设计缺乏深入理解的标志

  • C++允许静态成员函数