免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8658 | 回复: 24
打印 上一主题 下一主题

设计模式之Singleton [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-28 20:57 |只看该作者 |倒序浏览
快毕业了,最近一直找了一段时间的工作,参加了很多公司的面试,发现大公司对设计模式都比较感兴趣,都问了我设计模式相关的东西,所以这段时间复习了一下设计模式,并做了一个总结, 想和大家一起复习一下设计模式,欢迎大家补充和讨论:
一、 单例(Singleton)模式
单例模式的特点:
    单例类只能有一个实例。
    单例类必须自己创建自己的唯一实例。
    单例类必须给所有其它对象提供这一实例。
单例模式应用:
    每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。
一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键编号。否则会出现主键重复。
二、 Singleton模式的结构:

Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。(关于线程问题以及C#所特有的Singleton将在后面详细论述)。
三、 在什么情形下使用单例模式:
使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。
注意:
不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。
不要将数据库连接做成单例,因为一个系统可能会与数据库有多个连接,并且在有连接池的情况下,应当尽可能及时释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放,带来问题。
四.Singleton的代码实现
(1)C++版本
#include <iostream>

using namespace std;

class Singleton
{
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;static Singleton *Instance()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (NULL == _instance)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_instance = new Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _instance;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;void method1(){cout << " method1 is done~ " << endl;};

protected:
&nbsp;&nbsp;&nbsp;&nbsp;Singleton(void){ cout <<" Singleton() " << endl;};
&nbsp;&nbsp;&nbsp;&nbsp;virtual ~Singleton(){cout << "~singletont()" <<endl; }

&nbsp;&nbsp;&nbsp;&nbsp;static Singleton* _instance;
};

//static 变量需要在类定义外面进行初始化


Singleton* Singleton::_instance = NULL;


int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;cout << "Hello, world~!" << endl;
&nbsp;&nbsp;&nbsp;&nbsp;Singleton::Instance()->method1();
&nbsp;&nbsp;&nbsp;&nbsp;Singleton::Instance()->method1();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}




(2) C#版本



sealed class Singleton
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;private Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;public static readonly Singleton Instance = new Singleton();
}
&nbsp;
//实现延迟初始化


public sealed class Singleton
&nbsp;&nbsp;{
&nbsp;&nbsp;Singleton()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;public static Singleton GetInstance()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Nested.instance;
&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;class Nested
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Explicit static constructor to tell C# compiler


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// not to mark type as beforefieldinit


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static Nested()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;internal static readonly Singleton instance = new Singleton();
&nbsp;&nbsp;}
}
&nbsp;

(3)JAVA版本
Public class Singleton{
&nbsp;&nbsp;&nbsp;private static Singleton uniqueInstance;
&nbsp;&nbsp;&nbsp;private Singleton(){}
&nbsp;&nbsp;&nbsp;public static synchronized Singleton getInstance(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(uniqueInstance == null){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uniqueInstance;
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;// other useful methods here

}
/*这种写法可以实现单件模式,既简单又有效,利用了synchronized的同步方法。但是会带来严重的性能问题。同步一个方法可能造成程序执行效率下降100倍。因此,如果将getInstance()放到频繁运行的地方,就要重新考虑自己的设计了。
*/

&nbsp;


五参考资料

1.http://www.cppblog.com/SoRoMan/a ... 0140.html?opt=admin

2. http://leo-faith.javaeye.com/blog/177779

[ 本帖最后由 scuwb 于 2008-10-28 20:58 编辑 ]

评分

参与人数 1可用积分 +2 收起 理由
scutan + 2

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-10-28 21:00 |只看该作者
无语~~~~~

论坛徽章:
0
3 [报告]
发表于 2008-10-28 21:10 |只看该作者

回复 #2 YangFree 的帖子

Why?

论坛徽章:
0
4 [报告]
发表于 2008-10-28 21:19 |只看该作者
楼主 单例模式有优势吗? 其他模式呢?

论坛徽章:
0
5 [报告]
发表于 2008-10-28 21:45 |只看该作者

回复 #4 tonghuasanren 的帖子

这些设计模式的东西,只有在开发项目的实际过程中才会用上,一般写点小程序是用不上的~~
还有工厂模式,观察者模式,桥模式等比较经典的模式,等我整理了后会及时发出来的哈~~~

论坛徽章:
0
6 [报告]
发表于 2008-10-28 21:50 |只看该作者
顶楼主!

论坛徽章:
0
7 [报告]
发表于 2008-10-28 22:03 |只看该作者
可以看看MCD(Modern C++ Design)中关于单件的讨论

论坛徽章:
0
8 [报告]
发表于 2008-10-28 22:03 |只看该作者
模式无处不在.

论坛徽章:
0
9 [报告]
发表于 2008-10-28 22:10 |只看该作者
原帖由 scuwb 于 2008-10-28 20:57 发表
快毕业了,最近一直找了一段时间的工作,参加了很多公司的面试,发现大公司对设计模式都比较感兴趣,都问了我设计模式相关的东西,所以这段时间复习了一下设计模式,并做了一个总结, 想和大家一起复习一下设计模式,欢 ...

if (NULL == _instance)
        {
            _instance = new Singleton();
        }
线程不安全代码

论坛徽章:
0
10 [报告]
发表于 2008-10-28 22:14 |只看该作者
原帖由 blizzard213 于 2008-10-28 22:10 发表

if (NULL == _instance)
        {
            _instance = new Singleton();
        }
线程不安全代码

嗯.
加上线程安全这些代码就有点庞大了.



[ 本帖最后由 scutan 于 2008-10-28 22:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP