设计模式——单例设计模式

单例设计模式

一、解决的问题

保证一个类在内存中的对象唯一性。

比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。

二、如何保证对象唯一性?

1,不允许其他程序用new创建该类对象。
2,在该类创建一个本类实例。
3,对外提供一个方法让其他程序可以获取该对象。

三、步骤:
1,私有化该类构造函数。(为保证不让其他成员创建该类对象。可将构造函数私有化。)

2,通过new在本类中创建一个【私有并静态】的本类对象。
3,定义一个公有的方法,将创建的对象返回。

例:

 1 //饿汉式(开发用的比较多)
 2 class Single//类一加载,对象就已经存在了。
 3 {
 4     private static Single s = new Single();
 5 
 6     private Single(){}
 7 
 8     public static Single getInstance()//获取实例 *可控*:私有的成员变量s。
 9     {
10         return s;
11     }
12 }
13 
14 
15 //懒汉式(面试考的多)*多线程会出问题*
16 class Single2//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
17              //延迟加载形式。 
18 {
19     private static Single2 s = null;
20 
21     private Single2(){}
22 
23     public static Single2 getInstance()
24     {
25         if(s==null)
26             s = new Single2();
27         return s;
28     }
29 }
30 
31 
32 class  SingleDemo
33 {
34     public static void main(String[] args) 
35     {
36         Single s1 = Single.getInstance();
37         Single s2 = Single.getInstance();
38 
39         System.out.println(s1==s2);
40         
41 //        Single ss = Single.s;  
42 
43 //        Test t1 = new Test();
44 //        Test t2 = new Test();      //不能new
45         Test t1 = Test.getInstance();//通过这种方式获取实例
46         Test t2 = Test.getInstance();
47         t1.setNum(10);
48         t2.setNum(20);
49         System.out.println(t1.getNum());
50         System.out.println(t2.getNum());
51     }
52 }
53 
54 
55 class Test
56 {
57     private int num;
58 
59     private static Test t = new Test();
60     private Test(){}
61     public static Test getInstance()
62     {
63         return t;
64     }
65     public void setNum(int num)
66     {
67         this.num = num;
68     }
69     public int getNum()
70     {
71         return num;
72     }
73 
74 }

 结果:

true
20
20

说明拿到的实例是同一个。

posted @ 2017-02-08 21:02  Kkky  阅读(255)  评论(0编辑  收藏  举报