前序
单例子Singleton设计模式可能是被讨论和使用
![](/icons/17378de.gif)
最广泛
![](/icons/17378de.gif)
![](/icons/17378yi.gif)
个设计模式了
![](/icons/17378dou.gif)
这可能也是面试中问得最多
![](/icons/17378de.gif)
![](/icons/17378yi.gif)
个设计模式了
![](/icons/17378dou2.gif)
这个设计模式主要目
![](/icons/17378de.gif)
是想在整个系统中只能出现
![](/icons/17378yi.gif)
个类
![](/icons/17378de.gif)
例子
![](/icons/17378dou2.gif)
这样做当然是有必然
![](/icons/17378de.gif)
![](/icons/17378dou.gif)
比如你
![](/icons/17378de.gif)
软件Software
![](/icons/17378de.gif)
全局配置信息
![](/icons/17378dou.gif)
或者
是
![](/icons/17378yi.gif)
个Factory
![](/icons/17378dou.gif)
或是
![](/icons/17378yi.gif)
个主控类
![](/icons/17378dou.gif)
等等
![](/icons/17378dou2.gif)
你希望这个类在整个系统中只能出现
![](/icons/17378yi.gif)
个例子
![](/icons/17378dou2.gif)
当然
![](/icons/17378dou.gif)
作为
![](/icons/17378yi.gif)
个技术负责人
![](/icons/17378de.gif)
你
![](/icons/17378dou.gif)
你当
然有权利通过使用非技术
![](/icons/17378de.gif)
手段来达到你
![](/icons/17378de.gif)
目
![](/icons/17378de.gif)
![](/icons/17378dou2.gif)
比如:你在团队(Team)内部明文规定
![](/icons/17378dou.gif)
“XX类只能有
![](/icons/17378yi.gif)
个全局例子
![](/icons/17378dou.gif)
如果某人使用两
次以上
![](/icons/17378dou.gif)
那么该人将被处于2000元
![](/icons/17378de.gif)
罚款!”(呵呵)
![](/icons/17378dou.gif)
你当然有权这么做
![](/icons/17378dou2.gif)
但是如果你
![](/icons/17378de.gif)
设计
![](/icons/17378de.gif)
是东西是
![](/icons/17378yi.gif)
个类库
![](/icons/17378dou.gif)
或是
![](/icons/17378yi.gif)
个
需要提供给用户使用
![](/icons/17378de.gif)
API
![](/icons/17378dou.gif)
恐怕你
![](/icons/17378de.gif)
这项规定将会失效
![](/icons/17378dou2.gif)
![](/icons/17378yinwei.gif)
![](/icons/17378dou.gif)
你无权要求别人会那么做
![](/icons/17378dou2.gif)
所以
![](/icons/17378dou.gif)
这就是为什么
![](/icons/17378dou.gif)
我们希望通过
使用技术
![](/icons/17378de.gif)
手段来达成这样
![](/icons/17378yi.gif)
个目
![](/icons/17378de.gif)
![](/icons/17378de.gif)
原因
![](/icons/17378dou2.gif)
本文会带着你深入整个Singleton
![](/icons/17378de.gif)
世界
![](/icons/17378dou.gif)
当然
![](/icons/17378dou.gif)
我会放弃使用C
![](/icons/17378jiajia.gif)
语言而改用Java语言
![](/icons/17378dou.gif)
![](/icons/17378yinwei.gif)
使用Java这个语言可能更容易
让我介绍说明
![](/icons/17378yi.gif)
些事情
Singleton
教学版本
这里
![](/icons/17378dou.gif)
我将直接给出
![](/icons/17378yi.gif)
个Singleton
![](/icons/17378de.gif)
简单实现
![](/icons/17378dou.gif)
![](/icons/17378yinwei.gif)
我相信你已经有这方面
![](/icons/17378de.gif)
![](/icons/17378yi.gif)
些基础了
![](/icons/17378dou2.gif)
我们姑且把这具版本叫做1.0版
view plain copy to clipboard pr
![](/icons/17378int.gif)
?
=dp-j>
=alt>
=comment>// version 1.0
="">
=keyword>
public =keyword>
Singleton
=alt>
{
="">
=keyword>
private =keyword>
=keyword>
final Singleton singleton = =keyword>
null;
=alt>
="">
=keyword>
private Singleton
=alt>
{
="">
}
=alt>
=keyword>
public =keyword>
Singleton getInstance
="">
{
=alt>
=keyword>
(singleton
=keyword>
null)
="">
{
=alt>
singleton= =keyword>
Singleton
;
="">
}
=alt>
=keyword>
singleton;
="">
}
=alt>
}
在上面
![](/icons/17378de.gif)
例子中
![](/icons/17378dou.gif)
我想介绍说明下面几个Singleton
![](/icons/17378de.gif)
特点:(下面这些东西可能是尽人皆知
![](/icons/17378de.gif)
![](/icons/17378dou.gif)
没有什么新鲜
![](/icons/17378de.gif)
)
- 私有(private)
构造![](/icons/17378hanshu.gif)
表明这个类是不可能形成例子了
这主要是怕这个类会有多个例子
- 即然这个类是不可能形成例子
那么
我们需要
个静态
方式让其形成例子:getInstance![](/icons/17378kh.gif)
注意这个思路方法是在![](/icons/17378new.gif)
自己![](/icons/17378dou.gif)
其可以访问私有
构造![](/icons/17378hanshu.gif)
所以他是可以保证例子被创建出来![](/icons/17378de.gif)
- 在getInstance
中
先做判断是否已形成例子
如果已形成则直接返回
否则创建例子
- 所形成
例子保存在自己类中
私有成员中
- 我们取例子时
只需要使用Singleton.getInstance
就行了
当然
![](/icons/17378dou.gif)
如果你觉得知道了上面这些事情后就学成了
![](/icons/17378dou.gif)
那我给你当头棒喝
![](/icons/17378yi.gif)
下了
![](/icons/17378dou.gif)
事情远远没有那么简单
Singleton
实际版本
上面
![](/icons/17378de.gif)
这个
![](/icons/17378chengxu.gif)
存在比较严重
![](/icons/17378de.gif)
问题
![](/icons/17378dou.gif)
![](/icons/17378yinwei.gif)
是全局性
![](/icons/17378de.gif)
例子
![](/icons/17378dou.gif)
所以
![](/icons/17378dou.gif)
在多线程情况下
![](/icons/17378dou.gif)
所有
![](/icons/17378de.gif)
全局共享
![](/icons/17378de.gif)
东西都会变得非常
![](/icons/17378de.gif)
危险
![](/icons/17378dou.gif)
这个也
![](/icons/17378yi.gif)
样
![](/icons/17378dou.gif)
在多线程情况下
![](/icons/17378dou.gif)
如果多个线程同时
![](/icons/17378diaoyong.gif)
getInstance
![](/icons/17378kh.gif)
![](/icons/17378de.gif)
话
![](/icons/17378dou.gif)
那么
![](/icons/17378dou.gif)
可能会有多个进程同时通过
(singleton
![](/icons/17378dd.gif)
null)
![](/icons/17378de.gif)
条件检查
![](/icons/17378dou.gif)
于是
![](/icons/17378dou.gif)
多个例子就创建出来
![](/icons/17378dou.gif)
并且很可能造成内存泄露问题
![](/icons/17378dou2.gif)
嗯
![](/icons/17378dou.gif)
熟悉多线程
![](/icons/17378de.gif)
你
![](/icons/17378yi.gif)
定会说——
“我们需要线程互斥或同步”
![](/icons/17378dou.gif)
没错
![](/icons/17378dou.gif)
我们需要这个事情
![](/icons/17378dou.gif)
于是我们
![](/icons/17378de.gif)
Singleton升级成1.1版
![](/icons/17378dou.gif)
如下所示:
view plaincopy to clipboardpr
![](/icons/17378int.gif)
?
=dp-j>
=alt>
=comment>// version 1.1
="">
=keyword>
public =keyword>
Singleton
=alt>
{
="">
=keyword>
private =keyword>
=keyword>
final Singleton singleton = =keyword>
null;
=alt>
="">
=keyword>
private Singleton
=alt>
{
="">
}
="xspace-totlerecord">4
="xspace-totlepages">1/4
="xspace-current">1234>
延伸阅读
最新评论