单例设计模式
什么叫设计模式
设计模式指的是解决某一类问题行之有效的解决办法。
单例设计模式是用来解决什么问题的
单例模式可以保证一个类的对象唯一性。
比如多个程序都要使用同一个配置文件中的数据,且要实现数据共享和交换。必须要将数据封装到一个对象中,让不同的程序操作的是同一个对象。也就是说必须保证这个配置文件的对象唯一性。这个时候就是用单例。
单例设计模式的两种代码体现
饿汉式与懒汉式
1.饿汉式单例设计模式:这是先初始化对象,称为:饿汉式。SingleDemo类一进内存,就已经创建好了对象。
1. //饿汉式单例设计模式
2. class SingleDemo {
3.
4. //初始化一个静态本类对象,对,是本类对象。且本类对象在类初始化的时候就被创建。
5. //可以理解成,饿汉很饿,要迫不及待的将本类对象吃到肚子里。
6. private static SingleDemo s = new SingleDemo();
7.
8. //单例设计模式首先要有自己的私有,对,私有构造函数
9. private SingleDemo(){}
10.
11. public SingleDemo getString(){
12.
13. return s;
14.
15. }
16.
17. }
18.
19.
2.懒汉式单例设计模式:该单例模式在被调用方法时,才初始化对象,也叫对象的延时加载。称为:懒汉式。
注意:缺点:如果当线程刚执行完If(s==null)语句,该线程失去执行权,而另一个线程也运行该代码,判断s时也为空,创建了一个对象,第一个线程在运行时就又创建一个对象,不能保证单例了。
这时我们想到了锁。
总结:即便懒汉式能确保只创建一个对象,但是耗时太多,不如饿汉式方便。
面试点: if(s==null)
{
Synchronized(SingleDemo2.class)
{
if(s==null)
s= new SingleDemo2()
}
}
20. //懒汉式单例设计模式
21. class SingleDemo2 {
22.
23. //初始化一个静态本类对象,对,是本类对象
24. private static SingleDemo2 s = null;
25.
26. //单例设计模式首先要有自己的私有,对,私有构造函数
27. private SingleDemo2(){}
28.
29. //懒汉式单例设计模式在被调用方法的时候才初始化对象,对,懒汉很懒,被调用的时候才初始化
30. public SingleDemo2 getString(){
31.
32. if(s==null)
33. s = new SingleDemo2();
34. return s;
35.
36. }
37.
38. }
单例设计模式的小测试
1. //描述超人。
2. class SuperMan
3. {
4. private String name;//私有属性
5.
6. private static SuperMan man = new SuperMan("克拉克");//初始化一个本类对象
7.
8. private SuperMan(String name)
9. {
10. this.name = name;
11. }
12.
13. public static SuperMan getInstance()//获取本类对象的方法
14. {
15. return man;
16. }
17.
18. public void setName(String name)
19. {
20. this.name = name;
21. }
22.
23. public String getName()
24. {
25. return this.name;
26. }
27.
28. public void fly()
29. {
30. System.out.println(this.name +"..fly");
31. }
32. }
33.
34. class SingleTest
35. {
36. public static void main(String[] args)
37. {
38. //超人对象应该是唯一的。保证superMan的唯一性。可使用单例模式解决。
39. // SuperMan man = new SuperMan("克拉克");//单例不能new对象,它的构造函数是私有的
40. //man1、man2分别获取SuperMan的对象,因为SuperMan使用的是单例设计模式,所以他们获得的对象是同一个
41. SuperMan man1 = SuperMan.getInstance();
42. SuperMan man2 = SuperMan.getInstance();
43. man1.setName("英雄");//单例设计模式可以实现数据的共享和交换
44. man2.fly();//输出:英雄...fly
45. }
46. }