设计模式:就是对问题有效解决的一种方式,体现的其实就是一种思想。在编程中的设计模式和语言无关,只要知道这种问题的解决思路就可以OK了。(一共二十三设计模式)
单例设计模式解决的问题就是要保证一个类在内存中的对象唯一性
情景一 如果必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性
保证对象的唯一性 就需要保证
1、 不允许其他程序用new创建该类对象
2、在该类中创建一个本类实例
3、对外提供一个方法让其他程序可以获取该对象
方法:
1、私有化该类构造函数
2、通过new在本类中创建一个本类对象
3、定义一个公有的方法,将创建对象返回
单例模式像下面的方法就可以定义,这是单例模式的方法,但是我们怎么去用
class Single{
private static Single s = new Single();
private Single(){}
public static Single getInstance() {
return s;
}
}
就像下面的一样,就可以定义Single类的单列模式,s1,s2指向同一内存区
package www.fengkai.com;
/**
* 设计模式第一种——单列模式
* @author 冯凯
* @version 1.6
*/
class Single{
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
private static Single s = new Single();
private Single(){}
public static Single getInstance() {
return s;
}
}
public class SingeleDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
s1.setNum(1);
s2.setNum(2);
System.out.println(s1.getNum());
System.out.println(s2.getNum());
}
}
单例模式运行时在内存中,主函数先进栈,当Single s1的时候,要从Single中获取一个实例,此时Single就会定义一个私有的静态的对象s。给s在堆区分配一个内存空间,并且把地址付给s。此时对象s是在方法区中,如果继续Single s2,也调用getInstance(),s是静态的,在方法区,所以返回的值对象和s1指向的是同一个。
还有一种单列模式的设计方法
class Single2{
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance() {
if (s == null)
s = new Single2();
return s;
}
}
这种是单例模式的延迟加载形式(懒汉式)和前一种方法(饿汉式)不同的地方在于类加载进来,没有对象,只有调用getInstance方法是,才会去创建对象,而饿汉式类一加载就创建了对象。
{
在多线程开发中,懒汉式被并发访问时,可能无法保证唯一性
}