单例模式是众多模式中最简单的一个,了解单例模式及其应用对学习其他模式有很大帮助。但对于到底什么是单例模式,网上解释却不太容易理解,我根据自己的学习,对单例模式有了一定的了解,大家参考一下,有不对的地方请提提意见,在这里xiao yun~~先谢过了哈~~~~那么什么是单例模式呢?单例模式,是指某个类保证只创建一个实例,并且能够自己实例化这个对象而且能够向整个系统提供这个实例。显然单例模式的要点有三个;一是某各类只能有一个实例;二是它必须自行创建这个事例;三是它必须自行向整个系统提供这个实例。
单例模式又有三个变种,分别为饿汉式单例模式 、懒汉式单例模式 、登记式单例模式。
举个例子吧
例一:饿汉式单例模式
//单态模式的理解与运用
//饿汉式单例
//为什么叫饿汉式单例呢,因为这个类一被加载就自己创建了一个对象,
//而不管你用没用到这个对象
view plaincopy to clipboardprint?
1. public class Single {
2.
3. private static int count =0;
4.
5. //1.第一构造方法私有
6.
7. private Single(){
8.
9. count ++;
10.
11. };
12.
13. // 测试生成几个对象
14.
15. public static void getInfo(){
16.
17. System.out.println(count);
18.
19. }
20.
21. //2. 由自己实例化对象
22.
23. private static final Single sl = new Single();
24.
25. //3. 向整个系统提供本对象
26.
27. public static Single getSingle(){
28.
29. return sl;
30.
31. }
32.
33. }
34.
35. 下面测试这个单例模式程序到底是不是能只生成一个实例
36.
37.
38. public class TestSingle {
39.
40. public static void main(String[] args){
41.
42. //单利模式测试生成几个对象
43.
44. Single s1 = Single.getSingle();
45.
46. Single s2 = Single.getSingle();
47.
48. Single s3 = Single.getSingle();
49.
50. Single s4 = Single.getSingle();
51.
52. Single s5 = Single.getSingle();
53.
54. Single.getInfo();
55.
56. }
57.
58.
59. }
60.
61.
62. 由于例子写的注释写的很详细 我就不在具体解释了
63.
64. 下面的是饿汉式的例子
65.
66. //懒汉式单例模式
67.
68. public class Singleton {
69.
70. private static int count=0;
71.
72. private Singleton(){
73.
74. count++;
75.
76. };
77.
78. private static Singleton sn = null;
79.
80. synchronized public static Singleton getSingleton(){
81.
82. if(sn==null){
83.
84. sn = new Singleton();
85.
86. return sn;
87.
88. }
89.
90. else return sn;
91.
92. }
93.
94. public static void getInfo(){
95.
96. System.out.println(count);
97.
98. }
99.
100.
101. }
public class Single { private static int count =0; //1.第一构造方法私有 private Single(){ count ++; }; //测试生成几个对象 public static void getInfo(){ System.out.println(count); } //2.由自己实例化对象 private static final Single sl = new Single(); //3.向整个系统提供本对象 public static Single getSingle(){ return sl; } } 下面测试这个单例模式程序到底是不是能只生成一个实例 public class TestSingle { public static void main(String[] args){ //单利模式测试生成几个对象 Single s1 = Single.getSingle(); Single s2 = Single.getSingle(); Single s3 = Single.getSingle(); Single s4 = Single.getSingle(); Single s5 = Single.getSingle(); Single.getInfo(); } } 由于例子写的注释写的很详细 我就不在具体解释了 下面的是饿汉式的例子 //懒汉式单例模式 public class Singleton { private static int count=0; private Singleton(){ count++; }; private static Singleton sn = null; synchronized public static Singleton getSingleton(){ if(sn==null){ sn = new Singleton(); return sn; } else return sn; } public static void getInfo(){ System.out.println(count); } }
这里我要多说两句 到底懒汉和饿汉有什么区别呢
并不是仅仅一个同步 同步只是为了保证线程安全的 ,因为 懒汉式不是和饿汉式一样,只是在需要的时候才创建实例,所以容易出现多了线程同时创建的情况 所以加上同步。现在知道他们为什么起这样奇怪的名字了吧!
接下来要说的是 什么时候才会用到单例呢 现在金融危机 就举个银行的例子吧 大家都知道银行都有总行和分行,那么总行做为一个类来说,它就应该采用单例模式,假设不是单例模式,总行可以创建多个实例,那么你在支行创建一个总行的对象存了一些钱,我也在支行创建一个对象存了一些钱,那么总行知道自己到底有多少钱么 不知道 ,因为对象不同。所以必须采取单例模式。大家会发现这两种单例有个缺点,就是不能被继承,为解决这个问题,又提出了登记式单例模式。例子我还没写出来。。。。。。。。。。待续 如果大家想学习设计模式,推荐大家一本书。《java与设计模式》,据说是国内相当来说比较好的,想要的留言,我发给你!
单例模式又有三个变种,分别为饿汉式单例模式 、懒汉式单例模式 、登记式单例模式。
举个例子吧
例一:饿汉式单例模式
//单态模式的理解与运用
//饿汉式单例
//为什么叫饿汉式单例呢,因为这个类一被加载就自己创建了一个对象,
//而不管你用没用到这个对象
view plaincopy to clipboardprint?
1. public class Single {
2.
3. private static int count =0;
4.
5. //1.第一构造方法私有
6.
7. private Single(){
8.
9. count ++;
10.
11. };
12.
13. // 测试生成几个对象
14.
15. public static void getInfo(){
16.
17. System.out.println(count);
18.
19. }
20.
21. //2. 由自己实例化对象
22.
23. private static final Single sl = new Single();
24.
25. //3. 向整个系统提供本对象
26.
27. public static Single getSingle(){
28.
29. return sl;
30.
31. }
32.
33. }
34.
35. 下面测试这个单例模式程序到底是不是能只生成一个实例
36.
37.
38. public class TestSingle {
39.
40. public static void main(String[] args){
41.
42. //单利模式测试生成几个对象
43.
44. Single s1 = Single.getSingle();
45.
46. Single s2 = Single.getSingle();
47.
48. Single s3 = Single.getSingle();
49.
50. Single s4 = Single.getSingle();
51.
52. Single s5 = Single.getSingle();
53.
54. Single.getInfo();
55.
56. }
57.
58.
59. }
60.
61.
62. 由于例子写的注释写的很详细 我就不在具体解释了
63.
64. 下面的是饿汉式的例子
65.
66. //懒汉式单例模式
67.
68. public class Singleton {
69.
70. private static int count=0;
71.
72. private Singleton(){
73.
74. count++;
75.
76. };
77.
78. private static Singleton sn = null;
79.
80. synchronized public static Singleton getSingleton(){
81.
82. if(sn==null){
83.
84. sn = new Singleton();
85.
86. return sn;
87.
88. }
89.
90. else return sn;
91.
92. }
93.
94. public static void getInfo(){
95.
96. System.out.println(count);
97.
98. }
99.
100.
101. }
public class Single { private static int count =0; //1.第一构造方法私有 private Single(){ count ++; }; //测试生成几个对象 public static void getInfo(){ System.out.println(count); } //2.由自己实例化对象 private static final Single sl = new Single(); //3.向整个系统提供本对象 public static Single getSingle(){ return sl; } } 下面测试这个单例模式程序到底是不是能只生成一个实例 public class TestSingle { public static void main(String[] args){ //单利模式测试生成几个对象 Single s1 = Single.getSingle(); Single s2 = Single.getSingle(); Single s3 = Single.getSingle(); Single s4 = Single.getSingle(); Single s5 = Single.getSingle(); Single.getInfo(); } } 由于例子写的注释写的很详细 我就不在具体解释了 下面的是饿汉式的例子 //懒汉式单例模式 public class Singleton { private static int count=0; private Singleton(){ count++; }; private static Singleton sn = null; synchronized public static Singleton getSingleton(){ if(sn==null){ sn = new Singleton(); return sn; } else return sn; } public static void getInfo(){ System.out.println(count); } }
这里我要多说两句 到底懒汉和饿汉有什么区别呢
并不是仅仅一个同步 同步只是为了保证线程安全的 ,因为 懒汉式不是和饿汉式一样,只是在需要的时候才创建实例,所以容易出现多了线程同时创建的情况 所以加上同步。现在知道他们为什么起这样奇怪的名字了吧!
接下来要说的是 什么时候才会用到单例呢 现在金融危机 就举个银行的例子吧 大家都知道银行都有总行和分行,那么总行做为一个类来说,它就应该采用单例模式,假设不是单例模式,总行可以创建多个实例,那么你在支行创建一个总行的对象存了一些钱,我也在支行创建一个对象存了一些钱,那么总行知道自己到底有多少钱么 不知道 ,因为对象不同。所以必须采取单例模式。大家会发现这两种单例有个缺点,就是不能被继承,为解决这个问题,又提出了登记式单例模式。例子我还没写出来。。。。。。。。。。待续 如果大家想学习设计模式,推荐大家一本书。《java与设计模式》,据说是国内相当来说比较好的,想要的留言,我发给你!