Lio*_*ing 13 php model-view-controller design-patterns
我两者之间有些混乱.
singleton
检查实例是否存在返回它,或创建一个新实例.
注册表
检查实例是否存在返回它,或创建一个新实例并存储它.
他们之间有什么区别?
Lex*_*ius 15
两者都是关于实例控制的.不同之处在于,Singleton只允许给定类的一个实例,而Registry包含实例的1-1映射键.通常,键是(或表示)一个类,值是该类的实例.
例如,Code Igniter框架包含一个注册表,其中包含您加载的每个库/模型/控制器/帮助程序的实例,并且每次都返回这些相同的实例.
我一直喜欢的一个有趣的警告是,注册表模式正在利用单例来存储/检索动态对象列表。
单例模式是一种建立单点访问和方法的模式。虽然许多人认为这是一种反模式,但我向您保证,这只是因为他们的工作级别和编程类型。
单例模式用于较低级别来管理严格的资源。例如,虽然大多数语言都有包装键盘输入的库,但它实际上是一种单例模式,因为它具有非常严格的输入/输出,并且无论您有多少个键盘,都只能存在一个。
人们认为单例模式是反模式的原因之一是它们通常在单元测试系统中是不可测试的。在大多数语言中甚至不可能模拟单例,因为它被固定为特定的身份。
因此,单例应该是最小的,并使用包装器来连接它。
然后,您可以注入包装器,并且可以模拟它以使用假单例模拟。
注册表模式是您建立单一访问点的地方,但不是单一方法。这种注册表访问至少有 3 种方法:放置、查找和删除。这些方法依赖于单例模式来工作。
该映射是可测试的,因为它与您的使用无关,并且虽然注册表本身实际上不可与使用它的单元相关的单元测试,但您可以利用注册表打算包含的所有内容的模拟。
但是,如果您在使用它的给定架构中使用 IoC,则可以从容器注册表注入注册表,从而允许注入模拟注册表。
如今,控制反转非常流行,但其中很大一部分往往没有被学习或忽视。一些框架将其归结为大多数事物的工厂模式,将其余部分抽象出来。
我强烈鼓励大多数人放弃他们所知道的关于 IoC 的一切。
然后学习SOLID。后来读了一本关于 OOD 设计模式的书。(注:如果这本书有模式的优点和缺点,那就很好,如果它没有显示缺点,我会对这本书非常警惕。)
虽然这些术语是最近才创造的,但这些原则很早就以某种方式被学习了,并且实际上成为了面向对象设计的基础。
大多数面向对象开发人员成功使用的模式都基于 SOLID 原则。
对 SOLID 的引用,已列出并总结。 https://www.digitalocean.com/community/conceptual_articles/solid-the-first- Five-principles-of-object-oriented-design
最后的建议:即使您不是面向对象的开发人员,学习 SOLID 和 OOD 也非常有用,因为系统架构在将系统集成在一起时必须遵循类似的模式。
此外,我不建议您假设一种语言/模式/哲学最适合所有需求。不断学习,保持开放的心态。您知道的越多,您就能提供更好的解决方案。