黑马程序员-单例设计模式详解

------- android培训java培训、期待与您交流! ----------

首先,什么是设计模式呢?

设计模式就是由一些代码设计经验总结出来的可重用代码。能更好的优化代码。


为什么会有设计模式呢?

开发程序第一步就是如何去实现代码,那么实现代码所需要做的就是思想。一万个人就会有一万种思想

所以人们就会去研究哪个才是最有效率的最共用的一种。对我来说,这就是设计模式,它是以前各种各样开发人

总结出来的结晶。也是最行之有效的思想。


一共有几种设计模式呢?

一共有23种。


单例设计模式

每种设计模式都会针对一个问题,那么单例设计模式就是针对:一个类在内存中的对象的唯一性

例:比如多个程序需要同一个配置文件时,就会把这个文件封装成对象,会方便操作。

但是又要保证多个程序读取的对象是同一个,就需要让这个对象在内存中只创建一次。即唯一性


如何保证对象唯一性呢?

1.将构造函数私有化 : 不让其随意的去创建对象

2.在本类中创建一个本类对象,并将其私有化 : 为了对象的唯一性,将其私有,并且在本类中创建

3.在本类中创建一个能调用此对象的公有方法 : 从外部获取该对象的入口

因为构造方法已经为私有,所以不能从外部去创建该对象,需要将此方法设为私有,直接通过类名来调用


所以可以写出如下代码

class Single

{

private Single(){}

private static Single s = new Single();  //此处也一定要为静态,因为静态方法无法访问非静态属性

public static Single getInstance()

{

return s ;

}

}

上述代码只是通过上述的思路而创建出来的一个,其实它叫做饿汉式

这种方式会在类加载时就创建一个对象。

所以不管是否调用了这个方法,都会创建这个对象。所以会可能占有多余的内存。

并且此对象随着类的加载而加载,不会被垃圾回收机制所清除。


根据上述的缺点可以写出另一种写法,这种写法被称为懒汉式

class LazySingle

{

private LazySingle(){}

//将其暂时指向null

private static LazySingle s = null;

public static LazySingle getInstance()

{

if(s==null)

{

//增加同步锁,增强安全性

//但是即使有了这个锁,如果两个线程一个判断完了null进入了同步代码块获取了锁,而另一个已经判断了第一次的null方法

那么等锁放空后,它会继续执行下面的操作,所以需要第二次判断是否为空。防止两个同时进入锁后分别产生对象。

synchronized(LazySingle.class)

{

if(s == null)

s = new LazySingle();

}

return s ;

}

}

}

这种写法的特点在于延迟加载,只有在调用了此获取方法时才会真正的去创建对象。

所以在调用此方法前只是在方法区中创建了这个静态变量,并指向了null


这两种方法的区别:饿汉式同步是安全的,而懒汉式的同步是不安全的。

如何解决同步不安全的问题:增加同步代码块或者定义成同步函数

但是因为同步函数容易降低性能,所以使用同步代码块



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值