Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Singleton或DRY

Singleton或DRY
EN

Stack Overflow用户
提问于 2012-07-13 19:37:19
回答 3查看 187关注 0票数 2

假设您有一个与数据库交互的系统。因为系统大量使用数据库,所以几乎每个子例程都遵循这种模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo(database, rest, of, arguments)

这一点很快就被注意到了,因为foo是一个更大的对象的一部分,所以连接变量被移到了一个对象变量中。不幸的是,这意味着每个模型对象的构造函数都接受这个参数。

因此,您决定创建一个可以生成到数据库的连接的模块。由于与数据库的连接开销很大,因此会对连接进行缓存,并在以后的调用中返回缓存的值。

您刚刚创建的是一个单例。这是一种在开发社区中普遍不受欢迎的模式。再说一次,DRY是一个鼓励的原则,甚至比单例模式更不受鼓励。

您的选择是增加每个函数调用(或至少是构造函数)中的参数数量,或者创建一个单例。有没有第三种选择我看不到?

编辑:反对单例的文章是http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx。我认为这里提出的论点是有道理的,我希望反独身阵营能对这个设计问题有一个解决方案。

EN

回答 3

Stack Overflow用户

发布于 2012-07-13 19:49:29

DRY比“不要使用单例”要重要得多,如果有人真的表达过这样的原则的话(而不是说“不要滥用单例”)。如果可以,可以同时满足这两个要求,但如果必须只满足其中一个,请满足DRY。

票数 2
EN

Stack Overflow用户

发布于 2012-07-13 19:51:42

您还可以考虑查找或注入模式。使用连接细节创建一个单例,然后让任何需要连接的类使用“查找”或创建一个系统将其注入到您的类中。如果滥用都会导致问题,但对于共享资源来说,这些方法对我来说很有意义。

票数 1
EN

Stack Overflow用户

发布于 2012-07-23 22:56:31

单例作为一种将全局变量引入系统的方式被认为是不好的。

作为static变量实现的单例是不好的,因为它们不能很容易地模拟出来进行测试。由于是静态的,它们不会被注入,这就隐藏了依赖关系。您现在正在进行的讨论是由您在代码中看到的这种依赖项引起的。太棒了!你正在倾听代码,并试图找到更好的设计来做出反应。如果数据库访问是通过静态入口点进行的,您不会注意到依赖项的激增。

多个对象使用一个类的单个共享实例(通常作为服务)的概念是完全有效的设计。以这种方式考虑,所有服务对象最终都是一种“作用域单例”。也就是说,在这个子系统中,将只有一个X的实例。正确实现这是一个连接决策,而不是一个类实现决策。也就是说,你可以使用任何类作为单例,只需创建一个,并将相同的实例传递给任何想要一个实例的人……有问题的类不知道它是单例的。

我同意你的观点,将“数据库”传递给很多对象是一种异味。我会将对“数据库”的所有调用都分解到强类型的Repository对象中,每个对象上都有一个干净的接口,允许调用者请求它想要的数据集,而不必担心如何检索这些数据或将这些数据转换为域对象。然后,我会将所需的存储库注入到以前使用数据库的类的构造函数中,而不是在每次调用时传递它。如果你正在做“依赖注入”,你会发现连接代码移出了你的对象,进入了工厂类。然后,这些工厂将只将存储库注入实际需要查询存储库的类中。

我见过的一种模式是对象获得了它们并不真正需要的依赖,因为它们反过来将依赖传递给它们创建的其他对象。这是通过将这个“工厂”行为分解到它自己的类中来防止的。

不管怎样..。简短的答案是“继续挖掘……找出为什么这么多类需要数据库访问,应用单一责任原则和依赖注入来限制传播”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11477220

复制
相关文章
Singleton
Swift //: 第一种实现方式 懒汉 class Singleton: NSObject { class var shared: Singleton{ dispatch_once(&Inner.token){ Inner.instance = Singleton() } return Inner.instance! } struct Inner { static var instance:
用户3004328
2018/09/06
3410
php singleton()
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
2890
单件模式Singleton来控制窗体被重复或多次打开
本文转载:http://blog.csdn.net/a0700746/article/details/4473796
跟着阿笨一起玩NET
2018/09/19
1K0
关于Singleton
这东西可能每个引擎里都有吧, 不管它是宏还是模板. 用宏的人可能觉得模板编译慢, 另外不想多继承 用模板的人可以觉得宏丑陋, 不利于调试 不管哪种方式, 个人觉得这个东西总比全局变量好 这里说说几种常见的情况: 最简单的 这是一种偷懒的做法, 访问时自动创建 template <class T>   class Singleton   {   public:   static T* GetInstance()       {   static T singleton;   return &sing
逍遥剑客
2018/05/23
7340
可能被你误解的 DRY 原则
或许你听说过 DRY 原则,但我打赌,你理解的肯定有偏差;或许你从未听过,那太好了,本文会让你受益匪浅,对你的编码一定有指导作用,甚至对你的工作生活都有些许启发。
蛮三刀酱
2022/01/05
1.3K0
java中单态模式或单例模式(Singleton)有什么意义?
8.单态模式或单例模式(Singleton)  单态模式有什么用呢?想一下Adobe Photoshop ,处理两张图,会启动两个photoshop吗?多耗费内存呀! ( Consider Adob
马克java社区
2021/03/16
3650
java中单态模式或单例模式(Singleton)有什么意义?
创建型-Singleton
what 单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
acc8226
2022/05/17
4360
The process of Singleton creation
Screen Shot 2019-07-01 at 12.12.08 PM.png
lesM10
2019/08/26
6190
The process of Singleton creation
程序员修炼之道 — DRY 原则
DRY(Don’t Repeat Yourself),翻译成中文就是,不要重复你自己。这个原则最早出现在经典著作《程序员修炼之道》里,定义是这样的:系统的每一个功能都应该有唯一的实现,如果多次遇到同样的问题,就应该抽象出一个共同的解决方法,而不要重复开发同样的功能代码。但是对于DRY原则,会比较容易陷入如下的一些思维陷阱中:
用户9914333
2022/12/14
5480
程序员修炼之道 — DRY 原则
git merge模拟dry run功能
如果你使用过svn merge, 那你多半知道它有个–dry-run参数。 其功能是模拟merge过程,看下merge中会发生什么,以便根据情况决定是否要真正执行merge。 不幸的是,git merge并没有提供dry run选项。怎么办呢?
跑马溜溜的球
2020/12/07
9440
git merge模拟dry run功能
单例模式(Singleton)
单例模式(Singleton) 单例模式(Singleton) 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。 应用:Session或者控件的唯一示例等。 模式结构: 心得: 单例模式应
Florian
2018/02/05
6980
单例模式(Singleton)
Singleton模式小探
设计模式,这个多年前因为《设计模式》这本书而开始名声鹊起的软件名词,相信在当今年代早已为相关人士耳熟能详,你可以像大多数人那样对他顶礼膜拜,你也可以如极少数人一般对其嗤之以鼻,但是有一点是可以肯定的,那就是你肯定曾经听说过他、接触过他甚至运用过他(什么,你不知道什么是“设计模式”?……好吧,我是武断了点,请点击这里开始了解……)
用户2615200
2018/08/02
5980
Java Enum Singleton
今天回头看了单例模式,以前从没用过枚举单例,学习了一下,Enum Singleton 是目前最优的单例模式,好处有三:
用户7886150
2021/04/26
8900
单例模式(Singleton)
单例模式是一种创建型模式,它能确保一个类只有一个实例,并提供一个访问该实例的全局节点。
兜兜转转
2023/03/08
5240
单例模式(Singleton)
【创建模式】--Singleton
  Singleton 模式主要作用是保证在Java应用程序中,一个类Class 只有一个实例存在。
梅花
2020/09/28
4980
单例模式(Singleton)
单例模式(Singleton)–单线程 保证一个类仅有一个实例,并提供一个访问它的全局访问点,避免一个全局使用的类频繁的创建和销毁,节省系统资源,提高程序效率。怎么创建唯一的实例?Java是这么创建实例的 Person p = new Person();但是这么创建会创建多个实例,所以我们必须把构造器设为私有,这样其他类就不能使用new来实例化一个类。 public class Singleton { //定义一个属性,用来保存Singleton类对象的实例 private static
qubianzhong
2019/06/26
6160
设计模式日记——Singleton
单例模式 (Singleton Pattern)使用的比较多,比如我们的 controller 和 service 都是单例的,但是其和标准的单例模式是有区别的。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
六个核弹
2022/12/23
3100
Android发展Singleton模式
这是什么Singleton模式?它是Java23之间的一种模式,在Android发展也有着广泛的应用,例Calander类别,当对象是由未创建 new Calander而是Calander.getInstnce(),这就是单例模式的一种运用,应用的场合是什么呢?我们在非常多时候有些对象仅仅须要一个就够了,并不须要多个,就比方古代的皇帝,一山不容二虎,老虎多了仅仅有坏处没有优点。
全栈程序员站长
2022/07/06
3390
APIServer dry-run和kubectl diff
作者:Antoine Pelisse(Google Cloud,@apelisse)
CNCF
2019/12/05
2.2K0
设计模式之——Singleton pattern
The singleton pattern is implemented by creating a class with a method that creates a new instance of the class if one does not exist. If an instance already exists, it simply returns a reference to that object.
Yano_nankai
2018/10/08
4470

相似问题

Ruby:调用Singleton实例方法的DRY类方法

311

DRY DRY食谱

21

Kotlin中的Singleton与Dagger (@Singleton)或对象

12

扩展或实现simplexml以避免DRY

30

使重复的if/ DRY或case语句更加枯燥

51
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文