单例设计模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。
好处:单例设计模式有很多好处,比如节约内存空间,控制资源的使用。
模拟:1、私有化构造方法,因为不让外界随意去new
2、在类里面,自己new一个对象
3、在给外界提供一个获取的方式getxxx(),并把new出来的对象返回:
举例 :
实现主类:
public class Test{
public static void main(String[] args){
SingTon m = SingleTon.getMy() ;
SingTon m2 = SingleTon.getMy() ;
//比较基本类型的值,比的是值本身 1=2
//比较引用类型的值,比的是地址值
//equals()到底比啥?
// 如果不重写,使用Object提供的equals(),就是 = 比的,比对象间的地址值
// – 如果重写了equals() , 比对象间的属性值
System.out.println(m == m2) ;
//true --实现了单例,两次getMy()调用返回了同一个对象
}
}
}
饿汉式
class SingTon{
//私有化构造方法
private SingTon(){}
//自己创建对象 加static --静态资源getMy(),关联的资源必须也得是 静态的–静态只能调用静态
static private SingTon my = new SingleTon() ;
//设置全局访问点
加static是因为–无法通过对象访问getMy(),只能通过
类名.调用了
static public SingTon getMy(){
return my ;//把 my 返回给调用位置
}
}
懒汉式:-----面试重点
class SingTon(){
//私有化 构造方法
private SingTon(){}
//自己创建对象 加static --静态资源getMy(),关联的资源必须也得是 静态的–静态只能调用静态
static private SingTon my;
//设置全局访问点 加static是因为–无法通过对象访问getMy(),只能通过 类名.调用了
//同步方法,如果是静态方法,会自动分配锁对象是类名.class.如果是普通方法,分配的锁对象是this
static public SingTon getMy(){
//同步代码块的锁对象可以任意.但是如果共享资源是静态的,锁对象必须是固定的类名.class
synchronized(SingTon.class){
if(my==null){
my=new SingTon();
}
return my;
}
}
}
比较:饿汉式 – 不管你用不用对象,我们都会第一时间创建好,–浪费内存。
总结:1、有两种实现方法,饿汉式 懒汉式.
2、单例设计模式,是一套经过经验总结的开发过程.
私有化构造方法
在类的内部创建好对象
提供公共的全局访问点