/**
* 单例模式(singleton)
* 1、某个类只有一个实例
* 构造器私有化
* 2、它必须自行创建这个实例
* 用一个常量来存储
* 3、它必须向整个系统提供这个实例
* 向外提供获取这个实例的方式
* (1)直接暴露
* (2)用静态变量的get方法获取
*
*
*/
package singleton;
public class test {
public static void main(String[] args) {
//饿汉式:
//1、直接实例化饿汉式(简介直观)
Singleton1 singleton1 = Singleton1.INSTENCE;
System.out.println(singleton1);
//2、枚举式(最简洁)
Singleton2 singleton2 = Singleton2.INSTENCE;
System.out.println(singleton2);
//3、静态代码块饿汉式(适合复杂实例化)
Singleton3 singleton3 =Singleton3.INSTENCE;
System.out.println(singleton3);
//懒汉式:
//1、线程不安全(适用于单线程)
Singleton4 singleton4 = Singleton4.getInstance();
System.out.println(singleton4);
//2、静态内部类形式(适用于多线程)
Singleton5 singleton5 = Singleton5.getInstance();
System.out.println(singleton5);
}
}
package singleton;
/**
*
* 饿汉式:
* (直接创建这个实例对象,不管你是否需要,不存在线程安全问题)
* 1、直接实例化饿汉式(简介直观)
* 2、枚举式(最简洁)
* 3、静态代码块饿汉式(适合复杂实例化)
* @author admin
*
*/
public class Singleton1 {
public static final Singleton1 INSTENCE = new Singleton1();
private Singleton1() {
}
}
package singleton;
/**
* 枚举类型的构造器全部都是私有化的
* 限定为一个,就成了单例
* @author admin
*
*/
public enum Singleton2 {
INSTENCE;
}
package singleton;
import java.io.IOException;
import java.util.Properties;
public class Singleton3 {
public static final Singleton3 INSTENCE;
private String name;
static {
Properties pro = new Properties();
try {
pro.load(Singleton3.class.getClassLoader().getResourceAsStream("singleton.properties"));
} catch (IOException e) {
throw new RuntimeException();
}
INSTENCE = new Singleton3(pro.getProperty("name"));
}
private Singleton3(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Singleton3 [name=" + name + "]";
}
}
package singleton;
/**
* 懒汉式:
* (延迟创建实例对象)
* 1、线程不安全(适用于单线程)
* 2、静态内部类形式(适用于多线程)
* @author admin
*
*/
public class Singleton4 {
private static Singleton4 instance;
private Singleton4() {
}
public static Singleton4 getInstance() {
if(instance == null) {
instance = new Singleton4();
}
return instance;
}
}
package singleton;
/**
* 在内部类被加载和初始化时才创建INSTANCE实例对象
* @author admin
*
*/
public class Singleton5 {
private Singleton5() {
}
private static class Inner{
private static final Singleton5 INSTANCE= new Singleton5();
}
public static Singleton5 getInstance() {
return Inner.INSTANCE;
}
}
singleton.properties(在根路径下/src)
#key=value
name="imagination"