设计模式:单例(懒汉饿汉式,即简单讲解)
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
/*
* 设计模式:对问题行之有效的解决方式。其实它是一种思想
* 1、单例设计模式(单个实例)
* 解决的问题:可以保证一个类在内存中的对象唯一性
* 为什么要有单例:可以在多个程序访问对象时,保证他们访问的是同一个对象
*思路 :1、不允许其他程序用new创建该类对象
* 2、在该类中创建一个本类实例
* 3、对外提供一个方法,让其他程序可以获取该对象
*步骤:1、private该类的构造函数(不让用户初始化)
* 2、通过new在本类中创建一个本类的对象
* 3、定义一个共有(public)的方法,将创建的对象返回。
*/
/*饿汉式:不管是啥上来就干,开发时常用*/
class Single//类一加载,对象就已经存在了
{
static Single s = new Single();//饿汉式的体现,即在创建类时已经有对象
private Single(){}//构造函数
public static Single getInstance(String name)
{
return s;//小知识点:静态方法访问的元素必须是静态的
}
}
/*懒汉式:刚开始的时候什么都不做,等啥时候用才啥时候做,面试题常用
* 若被多线程技术访问,有可能导致访问不了对象(以后再补充)
*/
class Single2//只有调用getInstance方法时,才会创建对象
//也称为延迟加载形式
{
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance()
{
if(s==null)
s = new Single2();//若空则创建,不空则不创建。
return s;
}
}
class Test
{
private int num;
/*构造函数私有化*/
private Test(){}
/*在类中创建一个本类类型的对象*/
private static Test t = new Test();
/*对调用者返回唯一的对象。此时t代表已创建对象的地址。
* 不管函数调用多少次这里返回的都是同一个地址
*/
public static Test getInstance()
{
return t;
}
public void setNum(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
}
public class SingleDemo {
public static void main(String[] args) {
Single s1 = Single.getInstance("");
Single s2 = Single.getInstance("");
System.out.println(s1==s2);//true。两者是相等的,说明s1、s2指向同一片空间
// Test t1 = new Test();因为getInstance函数是静态的,可以直接用类名.函数名的形式调用。
// Test t2 = new Test();
/*如果使用new关键字,则代表在堆中创建了一片空间,但是因为成员是静态的,被保存在静态区内,所以堆中开辟出的空间等于垃圾。*/
Test t1 = Test.getInstance();
Test t2 = Test.getInstance();
/*在这里,t1、t2得到的值是同一个*/
t1.setNum(10);
t2.setNum(20);
/*先给num赋值10,再赋值20.因为两者指向同一片空间,所以第一次赋值的10已经被第二次赋值的20覆盖掉了*/
System.out.println(t1.getNum());//20
System.out.println(t2.getNum());//20
}
}