单例模式:
单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:
- 系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能
- 可以严格控制客户怎么样以及何时访问单例对象。
单例模式的写法有好几种,主要有三种:
- 懒汉式单例
- 饿汉式单例
- 登记式单例
实现代码:
package com.model.singleton;
public class Singleton {
private static Singleton lazySingleton = null;
private static volatile Singleton volatileLazySingleton = null;
private static final Singleton HUNGRY_SINGLETON = new Singleton();
private Singleton(){
}
public static Singleton getInstance() {
if (lazySingleton == null){
lazySingleton = new Singleton();
}
return lazySingleton;
}
public static synchronized Singleton getInstanceBySync() {
if (lazySingleton == null) {
lazySingleton = new Singleton();
}
return lazySingleton;
}
public static Singleton getInstanceByDbCheck() {
if (volatileLazySingleton == null) {
synchronized (Singleton.class) {
if (volatileLazySingleton == null) {
volatileLazySingleton = new Singleton();
}
}
}
return volatileLazySingleton;
}
public static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static final Singleton getInstanceByInnerClass() {
return LazyHolder.INSTANCE;
}
// ================server method===============
public void sayHello() {
System.out.println("Hello World!");
}
}
package com.model.singleton;
import java.util.HashMap;
import java.util.Map;
public class SingletonManagement {
private static Map map = new HashMap<>();
public static String DEFAULT_SINGLE_NAME = "default";
private SingletonManagement(){
}
public static Singleton getInstance(String name) {
if (name == null || name.length() <= 0){
name = DEFAULT_SINGLE_NAME;
}
if (map.get(name) == null){
map.put(name, Singleton.getInstanceByInnerClass());
System.out.println("initial singleton by management, name is " + name);
}
return map.get(name);
}
}
测试:
package com.model.singleton;
public class Test {
public static void main(String[] args) {
Singleton s1 = SingletonManagement.getInstance(null);
s1.sayHello();
Singleton s2 = SingletonManagement.getInstance("s2");
s2.sayHello();
Singleton s3 = SingletonManagement.getInstance(null);
s3.sayHello();
}
}
输出结果:
initial singleton by management, name is default
Hello World!
initial singleton by management, name is s2
Hello World!
Hello World!
参考自:Java设计模式之创建型:单例模式_张维鹏的博客-CSDN博客



