首先,什么是设计模式呢?
设计模式就是由一些代码设计经验总结出来的可重用代码。能更好的优化代码。
为什么会有设计模式呢?
开发程序第一步就是如何去实现代码,那么实现代码所需要做的就是思想。一万个人就会有一万种思想
所以人们就会去研究哪个才是最有效率的最共用的一种。对我来说,这就是设计模式,它是以前各种各样开发人
总结出来的结晶。也是最行之有效的思想。
一共有几种设计模式呢?
一共有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
这两种方法的区别:饿汉式同步是安全的,而懒汉式的同步是不安全的。
如何解决同步不安全的问题:增加同步代码块或者定义成同步函数
但是因为同步函数容易降低性能,所以使用同步代码块