面试的时候经常会有这样一个问题:来你给我手写一个单例模式吧.那么什么是单例模式.
人说我没对象,java回答,我给你new一个.而单例是你有潜在的女朋友,我不能给你找新的,但是我可以给你把她通过特殊的渠道介绍给你,这个女朋友是心属于你的(私有),就在那等着你召唤(静态),所以这么说来,单例这个女朋友的核心思想就是–私有(private).静态(static).
那么众所周知,单例模式分为懒汉模式和饿汉模式,懒汉模式安全,线程同步,饿汉模式不安全,不线程同步.各有妙用.
那么简单的单例模式是怎样组成的?简单的来说分为一个单例对象,一个测试类.代码如下:
1.SingletonPatternObject.java
package com.example.singletonPattern;
/**
* Created by zhangrui on 2018/4/18.
*/
/*
* @ClassName SingletonPatternObject
*@Description TODO
*@Author zhangrui
*@Date 17:33 17:33
*@Version
* */
public class SingletonPatternObject {
private static SingletonPatternObject singletonPatternObjectInstance = new SingletonPatternObject();
private SingletonPatternObject(){}
public static SingletonPatternObject getSingletonPatternObjectInstance(){
return singletonPatternObjectInstance;
}
public void showMessage(){
System.out.println("Hello,this is from the class of SingletonPatternObject!");
}
}
2.SingletonPatternDemo.java
package com.example.singletonPattern;
/**
* Created by zhangrui on 2018/4/18.
*/
/*
* @ClassName SingletonPatternDemo
*@Description TODO
*@Author zhangrui
*@Date 17:40 17:40
*@Version
* */
public class SingletonPatternDemo {
public static void main(String[] args) {
//私有不能实例化
//SingletonPatternObject singletonPatternObject = new SingletonPatternObject();
SingletonPatternObject singletonPatternObject = SingletonPatternObject.getSingletonPatternObjectInstance();
singletonPatternObject.showMessage();
}
}
可以看到,直接new对象的话会报错,截图如下:
通过对象得到实例的话会打印出来单例对象的一句话:
那么接下来是懒汉模式,懒汉模式就是每次创建对象的时候先对对象判断一下,没有这个对象的时候我在给你这个对象,有的话就不给了,双锁结构,方法上锁,内容上锁:
3:LazySingletonPatternDemo.java
package com.example.singletonPattern;
/**
* Created by zhangrui on 2018/4/19.
*/
/*
* @ClassName LazySingletonPatternDemo
*@Description TODO 懒汉模式 双锁结构 DCL double check lock
*@Author zhangrui
*@Date 17:19 17:19
*@Version
* */
public class LazySingletonPatternDemo {
private static LazySingletonPatternDemo lazySingletonPatternDemoInstance;
private LazySingletonPatternDemo(){};
//线程同步
public static synchronized LazySingletonPatternDemo getInstance(){
if (lazySingletonPatternDemoInstance==null){
synchronized (LazySingletonPatternDemo.class){
lazySingletonPatternDemoInstance = new LazySingletonPatternDemo();
}
}
return lazySingletonPatternDemoInstance;
}
}
饿汉模式就是荤素不忌,不管你有没有,我都会给你提供这么一个对象.
4.HungarySingletonPatternDemo.java
package com.example.singletonPattern;
/**
* Created by zhangrui on 2018/4/19.
*/
/*
* @ClassName HungarySingletonPatternDemo
*@Description TODO 饿汉模式
*@Author zhangrui
*@Date 18:04 18:04
*@Version
* */
public class HungarySingletonPatternDemo {
private static HungarySingletonPatternDemo hungarySingletonPatternDemoInstence;
private HungarySingletonPatternDemo(){}
private HungarySingletonPatternDemo getHungarySingletonPatternDemoInstence(){
return hungarySingletonPatternDemoInstence;
}
}
那么以后再有面试问你,给我手写一个单例模式,那就洒洒水了.
本模式代码链接都放在了GitHub上,有博主整理的几个设计模式,逐渐丰富,链接地址为:https://github.com/zhangruibin/designPattern
over!