单例模式
使用情景
一般实现
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Test {
public static void main(String[] args) {
Config config = new Config();
System.out.println(config.getParameterA());
System.out.println(config.getParameterB());
}
}
class Config{
private String parameterA;
private String parameterB;
public Config() {
readConfig();
}
private void readConfig() {
Properties properties = new Properties();
InputStream is = Config.class.getResourceAsStream("test.properties");
try {
properties.load(is);
this.parameterA = properties.getProperty("parameterA");
this.parameterB = properties.getProperty("parameterB");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
}
单例模式实现
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Test2 {
public static void main(String[] args) {
Singleton_Config sc1 =Singleton_Config.getInstance();
sc1.readConfig();
System.out.println(sc1.getParameterA());
System.out.println(sc1.getParameterB());
Singleton_Config sc2 =Singleton_Config.getInstance();
System.out.println(sc1 == sc2);
}
}
class Singleton_Config{
private static Singleton_Config instance;
private String parameterA;
private String parameterB;
private Singleton_Config() {
}
public void readConfig() {
Properties properties = new Properties();
InputStream is = Config.class.getResourceAsStream("test.properties");
try {
properties.load(is);
this.parameterA = properties.getProperty("parameterA");
this.parameterB = properties.getProperty("parameterB");
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static Singleton_Config getInstance() {
if(instance == null) {
instance = new Singleton_Config();
return instance;
}else {
return instance;
}
}
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
}
class Singleton{
private static Singleton instance;
private Singleton() {
}
public static Singleton GetInstance() {
if(instance == null) {
instance =new Singleton();
}
return instance;
}
}
public class Client{
public static void main(String[] args) {
Singleton s1 = Singleton.GetInstance();
}
}
多线程的情况
public class Test3 {
public static void main(String[] args) {
Runnable r =() ->{
Singleton s =Singleton.getSingleton();
System.out.println(s.toString());
};
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
}
class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
其他分类
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return Inner.instance;
}
private static class Inner {
private static final Singleton instance = new Singleton();
}
}