java设计模式之单例模式

时间不会辜负每一个平静努力的人!

欢迎来到周建的博客: 共同致力于技术分享与交流

1.单例设计模式

  • 懒汉式与饿汉式有什么不同?
    懒汉式的特点在于实例的延迟加载。
  • 懒汉式延迟加载有没有问题?
    有,如果多线程访问时会出现安全问题。
  • 如何解决?
    可以加同步来解决,但是稍微有些低效(同步代码块和同步函数都行),可以通过双重判断来解决低效问题,提高效率。

2.代码实现

(1)饿汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.zhoujian.singgleinstance.single;
/**
* Created by zhoujian on 2016/12/5.
*/
/**
* 饿汉式
*/
public class SingleOne
{
//私有构造函数,防止被实例化
private SingleOne(){}
//创建对象
private static final SingleOne mSingleOne = new SingleOne();
//获取对象
public static SingleOne getInstance()
{
return mSingleOne;
}
}

(2)懒汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.zhoujian.singgleinstance.single;
/**
* Created by zhoujian on 2016/12/5.
*/
/**
* 懒汉式
*/
public class SingleTwo
{
//私有构造函数,防止被实例化
private SingleTwo()
{
}
private static SingleTwo mSingleTwo = null;
public static SingleTwo getSingleInstance()
{
if (mSingleTwo == null)
{
synchronized (SingleTwo.class)
{
if(mSingleTwo == null)
{
mSingleTwo =new SingleTwo();
}
}
}
return mSingleTwo;
}
}

3.测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.zhoujian.singgleinstance.activity;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import com.zhoujian.singgleinstance.R;
import com.zhoujian.singgleinstance.single.SingleTwo;
public class MainActivity extends Activity
{
private SingleTwo mInstanceone;
private SingleTwo mInstanceteo;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mInstanceone = SingleTwo.getSingleInstance();
mInstanceteo = SingleTwo.getSingleInstance();
if (mInstanceone==mInstanceteo)
{
Toast.makeText(this, "两个对象是同一个对象", Toast.LENGTH_SHORT).show();
}
}
}

4.源码下载地址

源码下载地址:https://github.com/zeke123/SingleInstance