——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
黑马程序员–Java之单例设计模式01
一、什么是单例设计模式?
在编写程序的时候经常会遇到一些典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,大大师的实践中总结和理论化之后优先的代码结构、编程风格以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免得自己再去思考和摸索。
单例设计模式是Java中常用的一种设计模式,它是指在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象。就好像我们生存的世界只有一个月亮,假设现在要设计一个类表示月亮,该类只能有一个实例对象,否则就违背了事实。
单例模式的实现思想:
1、将构造函数私有化,
2、在类中创建一个本类对象
3、对外提供访问本类对象的方法
单例模式有如下特点:
1、类的构造方法使用private修饰,声明为私有,这样就不能在类的外部使用new关键字来创建实例对象了。
2、在类的内部创建一个该类的实例对象,并使用静态变量INSTANCE引用该对象,由于变量应该禁止外界直接访问,因此使用private修饰,声明为私有成员。
3、为了让类的外部能够获得类的实例对象,需要定义一个静态方法getInstance(),用于返回该类的实例INSTANCE。由于方法是静态的,外界可以通过“类名.方法名”的方式来访问。
class Single {
// 自己创建一个对象
private static Single INSTANCE =new Single();
private Single(){}
public static Single getInstance(){
return INSTANCE;
}
}
二、单例设计模式的设计方式
单例设计模式有两种设计方式,其一为:饿汉式,类加载器在加载Single类时就建立对象并初始化对象,由于构造方法私有,外界无法再创建对象,只能通过公有的getInstance方法获得该类的唯一对象。饿汉式代码简单,容易实现,故推荐使用饿汉式。
class SingleDemo{
public static void main(String[] args){
Single s1 = Single.getInstance();//若可以创建两个实例对象,则s1、s2不是同一对象
Single s2 = Single.getInstance();
s1.setNum(30);
System.out.println("s2="+s2.getNum());
}
}
class Single{
private Single(){//构造方法私有
public Static Single getInstance(){//公有的获取对象方法
return s;
}
public void setNum(int num){
this.name=name;
}
public int getNum(){
return num;
}
private static Single s = new Single();//初始化实例对象
private int num;
}
单例设计模式的第二种设计方式为:懒汉式。懒汉式只有在方法被调用时才初始化生成对象。又称对象的延迟加载。由于只有调用了getInstance方法时才生成对象,所以在多线程同时访问时存在安全隐患,会创建多个实例对象,使用同步上锁后虽然解决了此问题,但却降低了程序效率。最终解决方法为使用双重判断同步。
class Single{
private static Single s = null;//未初始化
private Single(){}//构造方法私有
public static synchronized Single getInstance(){
//调用了getInstance方法,才建立对象
if(s==null){
//第一次判断如果s为null则继续,否则就不用判断同步锁对象的状态
synchronized(Single.class){
//同步锁为该类所属的字节码文件对象
if(s==null)//第二次判断如果s为null则创建实例对象
s=new Single();
}
return s;
}
}
}
虽然实际开发中一般都使用饿汉式,但由于懒汉式涉及的知识点深,知识面广,面试经常遇到此问题,初学者应重点掌握。