黑马程序员——单例设计模式

来源:互联网 发布:软件开发交易平台 编辑:程序博客网 时间:2024/05/16 06:42

-----------android培训java培训、java学习型技术博客、期待与您交流!------------                                                                                                                

   单例设计模式

单例设计模式:产生一个类,并保证这个类在内存中只存在一个对象。

思想:保证对象唯一。也就是被创建的所有该类对象在内存中的地址唯一。

   属于这个类的所有变量(引用)都指向一个同一个地址。换句话来说就是这种

           对象在内存中只有一个,只是在应用是可能有多个名字(变量)与之对应。

1、避免其他程序多次建立该类对象,必须先禁止其他程序建立该类对象。

2、要让其他程序可以访问到该类对象,只有在本类中自定义一个自身的对象。

3、使其他程序可以对自定义对象进行访问,就必须对外提供一些访问方式。


与思想对应的实现步骤:

1、将构造函数私有化。

2、在类中创建一个本类对象。

3、提供一个方法可以获取到该对象。


应用方式:

对事物该怎么描述,还是怎么描述。

当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。


关键部分代码实现:

单例设计模式第一种表现形式(饿汉式),先初始化对象。

Single类一进内存,就已经创建好。

class Single{private Single(){}   //构造函数私有化private static Single s = new Single(); //创建自身对象public static Single getInstance()      //调用自身对象的成员方法{return s;}}public class SingleDemo {public static void main(String[] args) {Single ss = Single.getInstance();}}

单例设计模式的第二种表现形式(懒汉式),对象延时加载。

Single类进内存,对象还没有存在,只有调用getInstance方法时,才建立对象。

class Single{private static Single s = null;private Single(){}public static Single getInstance(){if(s==null)s = new Single();return s;}}


代码测试:

class Single{private int num;public void setNum(int num){this.num = num;}public int getNum(){return num;}private Single(){}   //构造函数私有化private static Single s = new Single(); //创建自身对象public static Single getInstance()      //调用自身对象的成员方法{return s;}}public class SingleDemo {public static void main(String[] args) {Single s1 = Single.getInstance();Single s2 = Single.getInstance();s1.setNum(23);System.out.println(s2.getNum());}}

控制台打印的运行结果:23

原因:Single类存在s、s1、s2三个引用,都指向同一个Single对象。


开发一般用饿汉式,因为其简单、安全。

在应用多线程时,懒汉式容易出现出现创建多个Single类对象的问题

如下所示:

class Single{private static Single s = null;private Single(){}public static Single getInstance(){if(s==null)//-->等待  这个地方可能会有多个线程进入,也就创建了多个Single对象。s = new Single();return s;}}
使用synchronized关键字可以解决这个问题。

如下所示:

class Single{private static Single s = null;private Single(){}public static synchronized Single getInstance(){if(s==null)//-->等待  这个地方可能会有多个线程进入,也就创建了多个Single对象。s = new Single();return s;}}
synchronized关键字修饰的方法只允许一个线程进入,其他线程要进入时必须先判断这个方法有没有线程在调用。这样就降低了程序的性能。
改良型解决方案:

class Single{private static Single s = null;private Single(){}public static Single getInstance(){if(s==null){synchronized(Single.class){if(s==null)s = new Single();}}return s;}}

利用双层判断减少getInstance方法运行时锁的判断次数。

总之,开发时定义单例设计模式时,建议使用饿汉式。


-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 





0 0