设计模式之单例模式
2015-06-22 13:32
190 查看
设计模式:解决某一类问题最行之有效的方法。
Java中有23种设计模式。
单例模式:解决一个类在内存中只存在一个对象。
如何用代码实现?
1.将构造函数私有化;
2.在类中创建一个本类对象;
3.提供一个方法可以获取到该对象。
单例模式有两种方法实现:
一、懒汉式
对象是方法被调用时才初始化。
Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才建立对象。
class Single{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null){
s=new Single();
}
return s;
}
}
二、饿汉式
先初始化对象,Single类一进内存,就已经创建好了对象。
class Single{
private static Single s=new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
开发一般用饿汉式,因为它安全简单。
如果用懒汉式,当多个程序同时访问时,就有可能出现问题,解决方案:
方案一:
class Single{
private static Single s=null;
private Single(){}
public static synchronized Single getInstance(){//加同步锁,一次只能进来一个,缺点:判断次数太多,影响速度。
s=new Single();
}
return s;
}
方案二:
class Single{
private static Single s=null;
private Single(){}
public static Single getInstance(){
if(s==null){
Synchronized(Single.class){
if(s==null){
/*
cpu轮流切换运行程序,当A进来,cpu切过去了,没有运行A的时候,A就被挂起,B就不能进来了,因为有同步锁。当C进来的时候,此时s!=null,就不会判断同步锁问题,这样减少了判断次数,速度会快点。
*/
s=new Single();
}
}
return s;
}
}
}
Java中有23种设计模式。
单例模式:解决一个类在内存中只存在一个对象。
如何用代码实现?
1.将构造函数私有化;
2.在类中创建一个本类对象;
3.提供一个方法可以获取到该对象。
单例模式有两种方法实现:
一、懒汉式
对象是方法被调用时才初始化。
Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才建立对象。
class Single{
private static Single s=null;
private Single(){}
public static Single getInstance()
{
if(s==null){
s=new Single();
}
return s;
}
}
二、饿汉式
先初始化对象,Single类一进内存,就已经创建好了对象。
class Single{
private static Single s=new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
开发一般用饿汉式,因为它安全简单。
如果用懒汉式,当多个程序同时访问时,就有可能出现问题,解决方案:
方案一:
class Single{
private static Single s=null;
private Single(){}
public static synchronized Single getInstance(){//加同步锁,一次只能进来一个,缺点:判断次数太多,影响速度。
s=new Single();
}
return s;
}
方案二:
class Single{
private static Single s=null;
private Single(){}
public static Single getInstance(){
if(s==null){
Synchronized(Single.class){
if(s==null){
/*
cpu轮流切换运行程序,当A进来,cpu切过去了,没有运行A的时候,A就被挂起,B就不能进来了,因为有同步锁。当C进来的时候,此时s!=null,就不会判断同步锁问题,这样减少了判断次数,速度会快点。
*/
s=new Single();
}
}
return s;
}
}
}
相关文章推荐
- 51nod 1165 整边直角三角形的数量
- 判断回文,位与,位或
- java基础—文件的切割与合并
- Billboard(线段树区间更新与求值)
- Javascript原型与对象等知识
- 学习了ZKW费用流
- 试一下LaTeX
- JavaScript 2048小游戏
- Ubuntu安装dos2unix命令
- 关于递归删除链表节点为什么不会断链问题解释
- 类,对象,方法
- mysql数据源spring配置
- 使用apt-fast 来加速你的Ubuntu 的apt
- 求助管理员,这是什么情况
- Cortex-A8嵌入式开发板平台搭建
- pl/sql developer导出数据到excel的方法
- Selenium2学习-016-WebUI自动化实战实例-014-Selenium 窗口选择
- 高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)
- alex教学视频--购物表
- GSON 学习