为什么使用单例模式,而不是静态方法,刨根问底

sunshmcsdn 2013-06-12 04:41:48
问题如题目,请不要把从网上艘来的内容随便一贴,那些内容都看过了,依然不明白,说的不详细。例如:有文章描述,使用单例模式可以应用面向对象的技术,而是用静态方法,就不是面向对象了。说的太含糊,能否举个例子,面向对象是为了解决问题,不是什么法律,写代码不能说不是面向对象就不好了,要看面向对象到底能解决什么静态方法解决不了的问题,这才是核心!所以请大侠把真正项目中的实例分享一下,请说明如果用静态方法实现会有什么弊端,我自己思考了很久,也看不出不使用单例有什么不好,网上最常见的使用单例模式读取配置信息的例子,我也看了,其实使用静态方法不是更简单吗,为什么非要用单例呢??
...全文
6164 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
devilcom 2014-09-16
  • 打赏
  • 举报
回复
单例需要的时候创建 不需要的时候可以释放 以单例模式还可以扩展为多例
harvey0930 2014-09-10
  • 打赏
  • 举报
回复
不管是单例还是静态类,都可以完成你想要的事情,可能静态类需要多一些参数,单例少一些参数,因为可以这一些属性当作参数来用,属性多,实例化占内存也多,占内存多了就要考虑让它别占那么多内存,所以单例就来了!只是一点个人的理解,也不知道对不对
moonwrite 2013-06-20
  • 打赏
  • 举报
回复
引用 44 楼 assassin5616 的回复:
[quote=引用 38 楼 microtry 的回复:] GOF的东西谈的是程序员思维,既不能提高设计能力,也不能提高生产效率; 比如35楼举的促销活动的例子, 这里需要的是: 发现和发明一组对象来完整的描述促销活动的业务逻辑和数据结构(这些和编程语言无关), 设计师需要做到的是在运行时刻由客户自行变更,扩展或组合各种花色的促销活动, 而不是--不停地发布程序来扩展促销活动的策略 客户是你学习设计的最好老师,而不是GOF, 把自己扮演成业务专家,才能设计出好的软件,而不需要编程能力 随便说个促销的业务规则, 同样是赠品,满赠和买赠却是两种类型,两者发生在销售的不同阶段, 你的设计文档清楚说明什么是商品促销,什么是整单优惠, 程序员自然可以轻松地实现
我就是一直有这种感觉啊,设计模式是个大坑啊, 让人白白浪费时间。这种应该属于了解但不需要深入的知识。[/quote] 不明白你为什么那么反感罗,我前面不是说了,它是代表某种经验和为了名称交流 又不是什么逆天的技能~ 有些人需要别人的经验的指导,有些人会自己总结经验~ 并不是每个人都是天才的~
  • 打赏
  • 举报
回复
单例,不也是一个对象 的静态实例 变量吗。 只不过是个对象。
assassin5616 2013-06-20
  • 打赏
  • 举报
回复
引用 38 楼 microtry 的回复:
GOF的东西谈的是程序员思维,既不能提高设计能力,也不能提高生产效率; 比如35楼举的促销活动的例子, 这里需要的是: 发现和发明一组对象来完整的描述促销活动的业务逻辑和数据结构(这些和编程语言无关), 设计师需要做到的是在运行时刻由客户自行变更,扩展或组合各种花色的促销活动, 而不是--不停地发布程序来扩展促销活动的策略 客户是你学习设计的最好老师,而不是GOF, 把自己扮演成业务专家,才能设计出好的软件,而不需要编程能力 随便说个促销的业务规则, 同样是赠品,满赠和买赠却是两种类型,两者发生在销售的不同阶段, 你的设计文档清楚说明什么是商品促销,什么是整单优惠, 程序员自然可以轻松地实现
我就是一直有这种感觉啊,设计模式是个大坑啊, 让人白白浪费时间。这种应该属于了解但不需要深入的知识。
assassin5616 2013-06-20
  • 打赏
  • 举报
回复
引用 42 楼 moonwrite 的回复:
[quote=引用 41 楼 sp1234 的回复:] [quote=引用 35 楼 moonwrite 的回复:] 就如牛人精通系统,网络,图形写游戏引擎 但他们搞不出《愤怒的小鸟》《捕鱼达人》... ....
这就好像说“牛人精通肯德基、麦当劳的所有操作规范和经营管理,但是他们反而搞不出摆地摊货那种脏了吧唧的简单小吃”。 这个话的逻辑,好像很刻意无理头地去发展了。[/quote] 我只想说,他们拥有做《愤怒的小鸟》《捕鱼达人》的技术,但且没有做成他们的组装创意。 貌似《捕鱼达人》现在月收入是上千万啊~~~~[/quote] 歪个楼,捕鱼达人,愤怒的小鸟这种游戏靠什么挣钱?它们本身收费吗?
moonwrite 2013-06-20
  • 打赏
  • 举报
回复
引用 41 楼 sp1234 的回复:
[quote=引用 35 楼 moonwrite 的回复:] 就如牛人精通系统,网络,图形写游戏引擎 但他们搞不出《愤怒的小鸟》《捕鱼达人》... ....
这就好像说“牛人精通肯德基、麦当劳的所有操作规范和经营管理,但是他们反而搞不出摆地摊货那种脏了吧唧的简单小吃”。 这个话的逻辑,好像很刻意无理头地去发展了。[/quote] 我只想说,他们拥有做《愤怒的小鸟》《捕鱼达人》的技术,但且没有做成他们的组装创意。 貌似《捕鱼达人》现在月收入是上千万啊~~~~
assassin5616 2013-06-20
  • 打赏
  • 举报
回复
引用 46 楼 moonwrite 的回复:
[quote=引用 44 楼 assassin5616 的回复:] [quote=引用 38 楼 microtry 的回复:] GOF的东西谈的是程序员思维,既不能提高设计能力,也不能提高生产效率; 比如35楼举的促销活动的例子, 这里需要的是: 发现和发明一组对象来完整的描述促销活动的业务逻辑和数据结构(这些和编程语言无关), 设计师需要做到的是在运行时刻由客户自行变更,扩展或组合各种花色的促销活动, 而不是--不停地发布程序来扩展促销活动的策略 客户是你学习设计的最好老师,而不是GOF, 把自己扮演成业务专家,才能设计出好的软件,而不需要编程能力 随便说个促销的业务规则, 同样是赠品,满赠和买赠却是两种类型,两者发生在销售的不同阶段, 你的设计文档清楚说明什么是商品促销,什么是整单优惠, 程序员自然可以轻松地实现
我就是一直有这种感觉啊,设计模式是个大坑啊, 让人白白浪费时间。这种应该属于了解但不需要深入的知识。[/quote] 不明白你为什么那么反感罗,我前面不是说了,它是代表某种经验和为了名称交流 又不是什么逆天的技能~ 有些人需要别人的经验的指导,有些人会自己总结经验~ 并不是每个人都是天才的~ [/quote] 觉得一个东西没用不算反感吧。而且就像我之前说的那样,GOF里面也有人反思认为设计模式解决的都是无关紧要的问题。 我就是觉得这东西没用,学了和不学差别不大。觉得在这上面花时间投入产出比比较低
  • 打赏
  • 举报
回复
引用 35 楼 moonwrite 的回复:
就如牛人精通系统,网络,图形写游戏引擎 但他们搞不出《愤怒的小鸟》《捕鱼达人》... ....
这就好像说“牛人精通肯德基、麦当劳的所有操作规范和经营管理,但是他们反而搞不出摆地摊货那种脏了吧唧的简单小吃”。 这个话的逻辑,好像很刻意无理头地去发展了。
  • 打赏
  • 举报
回复
引用 31 楼 zilaishuichina 的回复:
单例是个语法糖,是为了让对象只存在一个,为了让程序员想new第二个也new不出来的一种语法糖 静态对象则不是,你定义一个静态对象,我可以定义第二个,这在语法上没有任何问题 所以才会有,“当你希望你一个对象存在且存在一个的时候”,用单例,静态对象没法解决只存在一个这种需求
没看懂。 一个人不是在别人发布给他的dll,而是在他自己的dll(或者说它自己的工程)中某个class去定义一个静态变量,怎么就成了跟singleton去对比的东西了呢?
  • 打赏
  • 举报
回复
引用 37 楼 moonwrite 的回复:
再来一个比喻:做Photoshop软件的人计算机水平一定很高~但他们不一定就能用PS搞出好的作品来~
这个话搞到极端,但愿不要让人留下印象是“搞Photoshop的人完全可以脱离用户”。
缪军 2013-06-20
  • 打赏
  • 举报
回复
GOF的东西谈的是程序员思维,既不能提高设计能力,也不能提高生产效率; 比如35楼举的促销活动的例子, 这里需要的是: 发现和发明一组对象来完整的描述促销活动的业务逻辑和数据结构(这些和编程语言无关), 设计师需要做到的是在运行时刻由客户自行变更,扩展或组合各种花色的促销活动, 而不是--不停地发布程序来扩展促销活动的策略 客户是你学习设计的最好老师,而不是GOF, 把自己扮演成业务专家,才能设计出好的软件,而不需要编程能力 随便说个促销的业务规则, 同样是赠品,满赠和买赠却是两种类型,两者发生在销售的不同阶段, 你的设计文档清楚说明什么是商品促销,什么是整单优惠, 程序员自然可以轻松地实现
moonwrite 2013-06-18
  • 打赏
  • 举报
回复
那是一个比喻~~~ 说搞底层的人有搞底层的人做法,搞上层的人有上传的人的做法, 从计算机角度来讲,搞底层的人肯定比应用层的人厉害~ 再来一个比喻:做Photoshop软件的人计算机水平一定很高~但他们不一定就能用PS搞出好的作品来~ 另外,我没有说会设计模式的人就逆天了~ 我前面也高亮 经验 两个字,当然牛人可以自己想~普通人就借鉴一下罗~ 设计模式的另外一个目的:让建筑师们有一些“共同语言” A说:你试试这样写,把实现推迟到子类,然后好在运行时灵活替换.... A说:你试试策略模式
assassin5616 2013-06-18
  • 打赏
  • 举报
回复
引用 35 楼 moonwrite 的回复:
程序里确实是有一些“模式”可以发掘的。因为你总是可以借鉴以前的经验,用来构造新的程序。你可以把这种经验叫做“模式”。 GoF 借鉴的是一个叫 Christopher Alexander 的建筑师的做法。Alexander 给一些建筑学里的“设计模式”起了名字,试图让建筑师们有一些“共同语言”。可惜的是,Alexander 后来自己都承认,他的实验失败了。因为这些固定的模式,并没能有效地传递精髓的知识,没能让新手成长为出色的建筑师。 照搬模式东拼西凑,而不能抓住事物的本质,没有“灵感”,其实是设计不出好东西的。这就像照搬“模版”把作文写得再好,也成不了作家一样。 其实我想说创造者是Christopher Alexander 跟你讲讲 策略模式 吧 商城的促销活动 买300-100; 1元换2元; 积分翻倍... ... 一天一个样~ 你觉得那些牛人精通linux,要么特别精通网络,大数据 如果不会 策略模式 他们会怎么解决 写一大堆if esle?能写出可维护 易修改的程序出来么 条条大路通罗马,有些路很优雅,有些路则...... 我们是写应用层程序的,就是组装别人写好的东西 而那些精通linux,要么特别精通网络的牛人,通常他们是创建东西 然后给我们组装的,而设计模式提供我们更加好的组装经验 就如牛人精通系统,网络,图形写游戏引擎 但他们搞不出《愤怒的小鸟》《捕鱼达人》... ....
《愤怒的小鸟》和《捕鱼达人》跟设计模式就更不相关了,这东西跟程序都不怎么相关了。你真的有看到谁是因为精通设计模式而做出什么厉害东西的吗? 像你举的那个例子,只要肯动脑的人总是能想出办法的,根本不需要刻意去学习什么模式。这种也可能都是个人经历吧,因为我是从来没看到过有哪个大牛,不管是做策划的,搞产品的,还是负责技术攻坚的,会觉得设计模式有多重要。而且作为纯做应用的工程师,业务知识的价值大多了,程序本身价值其实一般。 就跟编码规范一样,估计这个又会引起口水仗无数,但是这些真的就跟茴香豆有四种写法一样,也许没到那个地步,但重要性确实有点低。
assassin5616 2013-06-14
  • 打赏
  • 举报
回复
引用 33 楼 moonwrite 的回复:
[quote=引用 30 楼 assassin5616 的回复:] [quote=引用 2 楼 sunshmcsdn 的回复:] to wanghui0380 : “如果需要唯一实例”,这句话我理解,只是为什么不使用类的静态方法实现,不是更简单吗,为什么非要用单例呢?搞那么复杂。
其实大多数时候确实区别不大,现在单例很多都只是提供一个模板类,你写你的类,最后用这个模板 就自然是单例。这样的话静态方法相比而言不是太实用。 另外就是万一哪天你不想把类当单例用了,还要一个个去掉static不是。不过这种区别本来就是很微小的区别,设计模式的创始人都说过他有时候都觉得设计模式的实用性其实很低,感觉解决的都是很无关紧要的问题。[/quote] 设计模式的创始人都说过他有时候都觉得设计模式的实用性其实很低,感觉解决的都是很无关紧要的问题。 这是什么观点~~~~~ 设计模式的创始人是谁? 你说说看? [/quote] 创始人一共四个了,GOF嘛。说这个的是其中一个,好像是在IBM做什么项目那个。其实我比较赞同这个观点,因为就我呆过的公司来说,可以称得上大牛的人要么特别精通linux,要么特别精通网络,大数据。设计模式与这些相比完全无关紧要,这么说吧,你打算创业,需要一个能撑住场面的牛人,你最希望的肯定是他能解决各种技术难点。至于设计模式,知不知道有什么影响吗?
moonwrite 2013-06-14
  • 打赏
  • 举报
回复
程序里确实是有一些“模式”可以发掘的。因为你总是可以借鉴以前的经验,用来构造新的程序。你可以把这种经验叫做“模式”。 GoF 借鉴的是一个叫 Christopher Alexander 的建筑师的做法。Alexander 给一些建筑学里的“设计模式”起了名字,试图让建筑师们有一些“共同语言”。可惜的是,Alexander 后来自己都承认,他的实验失败了。因为这些固定的模式,并没能有效地传递精髓的知识,没能让新手成长为出色的建筑师。 照搬模式东拼西凑,而不能抓住事物的本质,没有“灵感”,其实是设计不出好东西的。这就像照搬“模版”把作文写得再好,也成不了作家一样。 其实我想说创造者是Christopher Alexander 跟你讲讲 策略模式 吧 商城的促销活动 买300-100; 1元换2元; 积分翻倍... ... 一天一个样~ 你觉得那些牛人精通linux,要么特别精通网络,大数据 如果不会 策略模式 他们会怎么解决 写一大堆if esle?能写出可维护 易修改的程序出来么 条条大路通罗马,有些路很优雅,有些路则...... 我们是写应用层程序的,就是组装别人写好的东西 而那些精通linux,要么特别精通网络的牛人,通常他们是创建东西 然后给我们组装的,而设计模式提供我们更加好的组装经验 就如牛人精通系统,网络,图形写游戏引擎 但他们搞不出《愤怒的小鸟》《捕鱼达人》... ....
moonwrite 2013-06-13
  • 打赏
  • 举报
回复
引用 24 楼 caozhy 的回复:
静态方法和单件有什么可比性,按照GoF的实现方式,你实现单件还要用静态方法呢。
楼主应该是在说静态类~ 只是在使用他们的方法,所以.... 或者一时敲错了~
moonwrite 2013-06-13
  • 打赏
  • 举报
回复
.... 我没有说静态做不到设置中英文啊~ 我一直在表达那个更加容易面对变化,而更加容易修改 不是“单件就是配置文件???” 而是通过配置文件来创建我想要的单例~ 这是静态类做不到的~ 你现在有一个中文版的静态类,和一个英文版的静态类 我现在有一个语言接口,有一个中文版的,有一个英文版的(运行时需要单例) 你觉得那个更方便切换语言版本,修改代码上,和运行时~ 如果将来还有日文版,韩语版,那么谁修改的代码要多 违反了什么设计原则,嘻嘻 你不要一直说别人被毒害了,而是你太排斥了~,一来就喷博客园怎么毒害,(而且我看的设计模式是在书上看的,而不是在博客园) 说“没有复杂和不复杂的区别,只有符合不符合场景的需要” ——那举个场景出来啊,我最少举了一个场景 单例+好的设计可以解耦,比静态类好~ 你也说了“我们不用静态方法是因为静态方法是穿越性的,” 然后你在下面还要说勉强来个场景,碰 “读滴人反而忘了这个模式的真正含义,反倒把这些强制穿凿的应用当真理学了” 你一直就紧扣这单例是“如果需要唯一实例”把GOF说的视为真理, 我也没有反对啊~ 但我表达的是,我可以更加灵活地创建那个唯一需要的实例 接口,继承,多态 + 配置文件,反射,工厂,Ioc..... 灵活使用就可以比静态类好~ 记住楼主的问题 为什么要用单例,而不用静态类 即使你说““如果需要唯一实例”,这和什么静态不静态有半毛钱的关系??” 没有帮毛关系,你也解释一下为什么没半毛钱关系 不要丢下一句话,然后,就没有然后了~..... 睡觉先~明天继续开战~
threenewbee 2013-06-13
  • 打赏
  • 举报
回复
静态方法和单件有什么可比性,按照GoF的实现方式,你实现单件还要用静态方法呢。
threenewbee 2013-06-13
  • 打赏
  • 举报
回复
引用 wanghui0380 的回复:
好吧,你们在说静态方法啊。我以为在说静态类。
加载更多回复(29)

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧