Singleton(单例模式)

/**
 * 单例模式(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"
发布了247 篇原创文章 · 获赞 53 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/105383201