Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[转载] 设计模式系列之——单例模式(singleton)

8 views
Skip to first unread message

逆风行船

unread,
Apr 16, 2011, 6:40:34 AM4/16/11
to
[1;37m【 以下文字转载自 [32mDataBase [37m讨论区 】
【 原文由 [32m supercn [37m 于 [32mThu Apr 14 23:24:56 2011 [37m 所发表 】 [m
之前版主发的"征集技术文章"的帖子中,
曾经许诺把自己的一些心得发出来活跃一下版面。
由于工作忙还有各种乱七八糟的原因,一直没有兑现,
我心里也一直惦记着自己的许诺,也算是激励着我来写一些东西吧,
也许零零星星的,但是希望大家能展开讨论,提出批评。

这篇帖子我同时发到了自己的技术blog中了(http://hi.baidu.com/ncheng),
也贴过来,但是发现我调整的格式都表现不出来了,
代码部分都用边框底纹标出来了,但是贴出来显示的效果不好。
费话了这么多,下面进入正题吧。
------------------------------
单例模式,顾名思义就是只有一个类的实例,在应用中也是,如果某个场合中一个类只能有一个实例,比如一些同步程序,配置的读取程序中,那么就要使用单例模式,否则就会造成程序的混乱和数据操作的不一致。他是一种创建型模式。
由于底层程序设计语言的区别,单例模式的实现也有区别。比如在C++中,类中的属性不能由本类自己来实例化,但是在java和c#中就可以。这样在单例模式的静态私有类属性的构造上就有不同。但是基本的思想是一致的。
单例模式的实现思想:
给类一个私有静态的属性,然后有一个获得累实例的方法,此方法中返回类的私有静态属性(也就是类的实例)。同时类的构造方法对外不可见(构造函数设置为私有)。

Singletion的C#实现如下:
/// <summary>
/// 说明:单例模式
/// 作者:Truecn
/// 日期:2011-04-14
/// </summary>
public class Singleton
{
//定义单一的实例
private static Singleton instance = new Singleton();

/// <summary>
/// 构造方法为私有,不能被别人随便构造本类的实例,这个是单例模式的关键
/// </summary>
private Singleton()
{ }

/// <summary>
/// 取得本类实例的入口,所有本类的实例都是通过这个方法取得。
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
if (instance == null)
instance = new Singleton();
return instance;
}

/// <summary>
/// 本类的其他操作成员方法
/// </summary>
/// <returns></returns>
public string Method()
{
return "hello world!";
}
}


Java中和C#中差不多,但是在c++中就有点不一样了,GOF的描述就是C++版本的,如果对比一下就会发现,其中对类属性的写法如下:
//定义单一的实例
private static Singleton instance = null;

这种方法也被叫做延迟实例化。(这是我的叫法,我觉得这样叫比较准确,在GOF的翻译版中被叫做懒单例,英文是lazy,其实翻译成延迟我觉得更准确一些,熟悉ORM的都知道,在ORM中,有延迟加载一说,就是lazy,其实道理和这里的延迟加载一样,都是需要的时候才去做而不是提前做
好,这是对效率的一种考虑)。

使用方法如下:
//使用单例模式构建的类
string strHello = Singleton.GetInstance().Method();

--
[33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m
[36;44;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m
[33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m
[1;41;32m崇尚名利的年代,感动越发少了.不求能感动别人,能把自己深深感动已很难得 [0;37m [m
[5;1;32m且行且珍惜,且行且知足,且行且感恩,且行且行善. [0;37m [m

[m [1;33m※ 来源:.天大求实BBS bbs.tju.edu.cn.[FROM: 202.113.13.188] [m
--
[m [1;35m※ 转载:.天大求实BBS bbs.tju.edu.cn.[FROM: 202.113.13.188] [m

逆风行船

unread,
Apr 16, 2011, 6:41:18 AM4/16/11
to
因为是C#实现的,所以转这里来

【 在 supercn (逆风行船) 的大作中提到: 】
: [1;37m【 以下文字转载自 [32mDataBase [37m讨论区 】


: 【 原文由 [32m supercn [37m 于 [32mThu Apr 14 23:24:56 2011 [37m 所发表 】 [m
: 之前版主发的"征集技术文章"的帖子中,
: 曾经许诺把自己的一些心得发出来活跃一下版面。
: 由于工作忙还有各种乱七八糟的原因,一直没有兑现,

: ...................

--
[33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m
[36;44;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m
[33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m [33;41;2;5m█ [0m [34;42;2;5m█ [0m [35;43;2;5m█ [0m [36;44;2;5m█ [0m [37;45;2;5m█ [0m [31;46;2;5m█ [0m [32;47;2;5m█ [0m
[1;41;32m崇尚名利的年代,感动越发少了.不求能感动别人,能把自己深深感动已很难得 [0;37m [m
[5;1;32m且行且珍惜,且行且知足,且行且感恩,且行且行善. [0;37m [m

[m [1;35m※ 来源:.天大求实BBS bbs.tju.edu.cn.[FROM: 202.113.13.188] [m

0 new messages