什么是单例模式,单例模式解决的问题
单例 听这个名字就知道是单着的,唯一的,例:就是实例
单例合起来就是这个类在整个系统中值能有一个实例对象可被获取和使用的代码模式,就称之为单例模式。
单例模式怎样来操作;
一: 这个类只能有一个唯一的实例;
【构造器私有化】
二:这人个类要自己创建自己的实例
【含有一个该类的静态变量来保存着个类的实例】
三:这个类必须自己向外界去提供这个实例
提供实例有两种方法【1、直接暴露的方式】【2、用静态变量的get方法获取】
创建单例模式有两大类 :饿汉式:饿汉式是运行时就加载进来 线程是安全的
饿汉式有三种,1.直接实例化 2.枚举 3.静态代码块实现
懒汉式: 懒汉式不是在程序运行时就加载,而是在需要的时候加载进来 线程不太安全
懒汉式三种实现方式:1.线程不安全,适用于但线程 2.线程安全【适用于多线程】
3.静态内部类【适用于多线程】
接下来我们就来用代码来演示一下单例模式的各个用法吧
/**
* 饿汉式 直接获取实例
*/
class SingleExample {
/**
* 首先聊一下为什么要有单例类的出现,它又是解决什么问题的应该怎么去写
* 1 当我们想有一些数据不可以共享但不被外界所改变构造器私有化
* 2 自己创建自己的实例对象
* 3 提供一个对外获取实例的方式
*/
// 自己创建一个自己的实例对象
public static final SingleExample INSTANCE = new SingleExample();
// 私有化构造器
private SingleExample() {}
}
-----
**
* 枚举类型是创建有限个实例。jdk1.5 以后的出现的enum
*/
enum SingleExample1{
INSTANCE;
}
---
class SingleExample2{
public static SingleExample2 INSTANCE;
private String info;
private SingleExample2(String info) {
this.info = info;
}
static {
Properties pro = new Properties();
//single.properties文件名,可以在文件获取需要的实例
try {
pro.load(SingleExample2.class.getClassLoader().getResourceAsStream("single.properties"));
INSTANCE = new SingleExample2(pro.getProperty("info"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static SingleExample2 getINSTANCE() {
return INSTANCE;
}
public static void setINSTANCE(SingleExample2 INSTANCE) {
SingleExample2.INSTANCE = INSTANCE;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
----
/**
* 懒汉式单线程创建 线程存在不安全性
*/
class SingleExample3{
public static SingleExample3 INSTANCE = null;
private SingleExample3(){}
public static SingleExample3 getInstance(){
if (INSTANCE == null) {
INSTANCE = new SingleExample3();
}
return INSTANCE;
}
}
------
**
* 懒汉式多线程创建 线程安全
*/
class SingleExample4{
public static SingleExample4 INSTANCE = null;
private SingleExample4(){}
public static SingleExample4 getInstance(){
if(INSTANCE == null) {
synchronized (SingleExample4.class) {
if (INSTANCE == null) {
INSTANCE = new SingleExample4();
}
}
}
return INSTANCE;
}
}
------
/**
* 懒汉式 静态内部类创建
*/
class SingleExample5{
private SingleExample5() {
}
private static class Inner {
private static final SingleExample5 INSTANCE = new SingleExample5();
private static SingleExample5 getInstance() {
return Inner.INSTANCE;
}
}