单例模式

面试的时候经常会有这样一个问题:来你给我手写一个单例模式吧.那么什么是单例模式.
人说我没对象,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!

发布了111 篇原创文章 · 获赞 49 · 访问量 17万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览