的荣耀,全球变成为一个gloried全球类。有些人说打破目面向设计。

给我方案,除美好的旧记录器在那里使用的单例。

有帮助吗?

解决方案

我的寻求真相我发现,实际上有很少的"可接受"的原因对使用单独.

其中一个原因,往往出了一遍又一遍的互联网是一个"记录"类(其中你提到的).在这种情况下,一个单一实例可以使用,而不是一个单一的类的实例因记录类通常需要使用一遍又一遍令人作呕的每一类中的项目。如果每一类使用这类记录、依赖注射变得繁琐。

记录是一个具体的例子的"可接受"单实例,因为它不影响执行代码。禁止采伐,执行代码是一样的。启用它,同相同。Misko把它放在以下方式 根本原因的单身, "的信息在这里流方式一:从你的应用程序进入的记录。尽管记录器是全球状态,由于没有信息流动从记录到应用程序、记录仪都可接受的"。

我敢肯定还有其他的有效原因。亚历克斯*米勒,在"模式,我恨",谈判的服务定位器和客户的侧UI也可能是"可接受"的选择。

读取更多单独的,我爱你,但你让我下来。

其他提示

一个单独的候选人必须满足三个要求:

  • 控制同时访问一个共享的资源。
  • 访问的资源将被要求从多个不同的部分系统。
  • 只能有一个对象。

如果你的提议的单仅仅具有一个或两个以上这些要求,重新设计几乎总是正确的选项。

例如,一台打印机程序是不可能被称为从多个地方(印菜单),因此可以使用互斥到解决并行访问的问题。

一个简单的记录是最明显的例子可能有效的单,但这可以改变与较复杂的伐木计划。

阅读配置,文件应只读在启动时间和封装在一个单独的.

你使用一个单独的时候你需要管理共享资源。例如打印机的后台处理程序。你的应用程序应该只有一个单一实例的程序,以便避免相互冲突的要求的同样资源。

或者一个数据库连接或文件经理等等。

只读储存单一的全球国家(用户的语言,帮助文件路径、应用程序的道路)是合理的。要小心使用单来控制业务逻辑的单几乎总是结束是多

管理一个连接(或游泳池的连接)向一个数据库。

我会用它还检索和存储信息的外部结构的文件。

方法之一使用一个单一实例的是涵盖一个实例,其中必须有一个单个"经纪人"控制进入一个资源。单是良好的记录,因为他们的经纪人的访问,也就是说,一个文件,该文件只能写到。为什么就像记录,它们提供了一种方法的抽象离写的东西就像一个日志的文件-你可以换一个缓存机制对你的单,等等。

还认为的一种情况,你有一个应用程序与许多windows/线/等,但这需要一个单一点的通信。我曾经使用过一个控制的工作,我想我应用程序来启动。单独负责序列化的工作和显示他们的状况的任何其他部分的计划很感兴趣。在这种情况下,你可以看看一个单独作为类似"服务器"一类的内部运行你的申请...禾田

一个单时应使用管理的资源是共享的整个应用程序,这将是破坏性的潜在有多个实例,同一类。确保对共享资源的访问线安全是一个很好的例子,这种模式可以是至关重要的。

当使用单身,你应该确保你不会隐瞒的依赖关系。理想的是,单身人士(最喜欢的静态变量在应用程序)设立执行期间你的初始化时代码的应用程序(则()C#可执行文件,则()java可执行),然后通过在所有其他类实例,这需要它。这有助于维持可测试性。

一个实际的例子的一个单一实例中可以找到 测试::建设者, ,这类背上只是关于每一个现代Perl测试模块。测试::建设者的单独存储和经纪状态的历史和测试过程(历史的测试结果,所计数的测试运行)以及东西喜欢在那里测试出去。这些是所有必要协调多个测试模块,由不同的作者,共同努力在一个单一的测试脚本。

历史的测试::建单是教育。叫 new() 总是给你同样的对象。第一,所有的数据存储为类变量什么也没有在目的本身。这一工作,直到我想测试测试::者本身。然后我需要两个试验::建设者的对象,一个设置作为一个虚拟的,捕获和测试其行为和输出,并且一个以真正的测试对象。在这一点测试::建设者是重构成一个真正对象。单的目的是存储为类数据,以及 new() 总是会返回。 create() 加入新的对象和使测试。

目前,用户是想改变某些行为的测试::建设者在他们自己的模块,但是其他人离开独自一人,而测试的历史仍然在普遍所有的测试模块。发生了什么现在是单片测试::建设者的对象是被分解成更小的碎片(历史、输出格式...)与一个试验::建设者的实例收集在一起。现在测试::生成器不再是一个单独的.其组成部分,像历史,就可以。这推动了不灵活的必要性的一个单独的下一个级别。它提供了更多的灵活性,用户混合和匹配件。较小的单独的对象可以现在仅存储数据,其中含有对象决定如何使用它。它甚至允许一个非测试::建设者类玩沿着通过使用测试::建设者的历史和输出单.

似乎有一些推动和拉动之间的协调的数据和灵活性的行为,这可以减轻通过将单独周围的共用数据的最小数量的行为能够确保数据的完整性。

当你载入一个构成性对象,无论是从数据库或文件,它有助于把它作为一个单一实例;没有任何理由保留重新阅读静态数据,这不会改变,同时在服务器运行。

我想单独使用可被认为如同许多对一关系在数据库。如果你有许多不同部分代码的工作需要有一个单一实例的对象,那就是在那里使用单.

如大家所说的,共享资源的具体的东西,无法处理并行的访问。

一个具体的例子,我所看到的,是一个分类:设搜索引的作家。

共享的资源。特别是在PHP,一类数据库、一个模板类和全球变贮存库的类。都是共享的所有模块/课程,这些课程被用来在整个代码。

这是一个真正对象的使用情况->的模板类含有的网页模板,正在修建的,并得到成形、增加、改变了通过模块添加到网页的输出。它必须保持为一个单一的实例,以便可能发生这种情况,并且同样的数据库。与共享数据库的单,所有模块'类可以获得查询和获取他们没有必要重新运行。

全球变仓库单独提供一个全球性的、可靠的并容易使用的变量的仓库。它收拾你的代码一个很大很多。想象一下,所有配置的价值在一系列在一个单一实例,如:

$gb->config['hostname']

或具有所有的语言的价值观在一个阵列,如:

$gb->lang['ENTER_USER']

在结束运行,该页的代码,你会得到,也就是说,一个现在已经成熟:

$template

单独, $gb 单独拥有lang阵列,用于更换,所有输出的装载和准备。你只是取代它们到钥匙,现在存在成熟的模板对象的页面的数值,然后作出为用户。

伟大的优点是可以做任何后处理你喜欢的任何东西。你可以管所有语言的价值观谷歌翻译,或者另一个翻译服务,并让他们回来,替他们进入他们的地方,翻译,例如。或者,你可以替代在网页的结构,或者,内容弦,你想要的。

你可以使用单独在实现国家的模式(在所示的方式GoF书)。这是因为具体国家课程没有自己的国家,并执行他们的行动方面的一个方面类。

你也可以使抽象的工厂的一个单独的.

它可以是非常务实的配置具体的基础设施问题作为单身或全球变量。我最喜欢的例子是依赖注射框架使用的单身作为一个连接点的框架。

在这种情况下你正在采取一种依赖的基础设施简化使用的图书馆和避免不必要的复杂性。

我使用它的一个目封命令行参数的当处理可插入模块。主要的程序并不知道什么是命令行参数的模块,获得载入(并不总是知道什么样的模块正在加载).例如,主要载荷,其中不需要任何参数本身(那么,为什么它应该采取额外的指针/reference/不管,我不确定-看起来像是污染),然后载荷的模块X、Y和Z。两个这样说的X和Z,需要(或接受)的参数,所以他们叫回来的命令行单独来告诉你什么参数,以接受、以及在运行时他们叫回来找出是否用户实际上已指定任何他们。

在许多方面,单独处理CGI参数会的工作同样如果你只使用一个过程的每次查询(其他mod_*方法不这样做,所以它将会是不好有-这样的论点,说你不应该使用单在mod_cgi世界的情况下,你口的mod_perl或什么的世界)。

一个例子码,也许。

在这里,ConcreteRegistry是一个单独在一个扑克游戏,允许的行为的所有方式包树访问的几个核心接口的比赛(即,立面模型,来看,控制器、环境、等等):

http://www.edmundkirwan.com/servlet/fractal/cs1/frac-cs40.html

Ed。

1-在第一个回答:

我不同意一种静态记录器类。这可以实际执行,但它不能是更换为单位的测试。一个静态的类的不可替代的通过测试一倍。如果你不单元的测试,你不会没看见这里的问题.

2-我不要尝试创建一个单独的手。我只是创建一个简单的对象与构造,请允许我注射的合作者为对象。如果我需要一个单独的,我会用一个依赖inyection框架(Spring.NET团结。净、弹Java),或其他一些。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top