直播软件开发,单例设计模式很简单吗?
直播软件开发,单例设计模式很简单吗?
单例设计模式,相信是大家接触设计模式时的入门设计模式,它理解起来比较简单,当然实现起来也很简单,但是别看不上这简单的东西,简单的事情重复做将不再简单,再复杂的事情拆分开来也是由很多简单的事情的集合。接下来来过一遍三种经典的单例模式。
1、构造方法私有化;
2、实例化的变量引用私有化;
3、获取实例的方法共有。
public class DCLSingleton implements Serializable {
private static final long serialVersionUID = 6242241249985894658L;
/**
* volatile :内存中可见 和 防止指令重排
* 这里主要作用是防止指令重排
*/
private volatile static DCLSingleton instance;
private DCLSingleton() {
}
public static DCLSingleton getInstance() {
if (instance == null) {
synchronized (DCLSingleton.class) {
if (instance == null) {
instance = new DCLSingleton();
}
}
}
return instance;
}
public void singletonFunction() {
System.out.println("DCLSingleton test.");
}
}
public class StaticSingleton implements Serializable {
private static final long serialVersionUID = 5537012394799626447L;
private static class SingletonHolder {
private static final StaticSingleton INSTANCE = new StaticSingleton();
}
private StaticSingleton(){}
public static final StaticSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
public void singletonFunction() {
System.out.println("StaticSingleton test.");
}
}
public enum SingletonEnum {
/**
* 实例
*/
INSTANCE;
/**
* 方法
*/
public void singletonFunction() {
System.out.println("SingletonEnum test.");
}
}
以单例性和安全性 2 个方向对以上 3 种单例模式进行测试,看哪种比较适合
public class TestSerializable {
public static void main(String[] args) throws IOException, ClassNotFoundException {
System.out.println("----------------双重否定单例模式测试开始-----------------------------");
DCLSingleton instance_1 = DCLSingleton.getInstance();
ByteArrayOutputStream byteArrayOutputStream_1 = new ByteArrayOutputStream();
new ObjectOutputStream(byteArrayOutputStream_1).writeObject(instance_1);
ObjectInputStream objectInputStream_1 = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream_1.toByteArray()));
DCLSingleton singleton_1 = (DCLSingleton) objectInputStream_1.readObject();
//com.songo.singletonpattern.service.SingletonPattern1@27c170f0
System.out.println(instance_1);
//com.songo.singletonpattern.service.SingletonPattern1@3d494fbf
System.out.println(singleton_1);
//DCLSingleton test.
singleton_1.singletonFunction();
//序列化和反序列化后是否相同:false
System.out.println("序列化和反序列化后是否相同:" + (instance_1 == singleton_1));
System.out.println("----------------双重否定单例模式测试结束-----------------------------");
System.out.println("----------------静态内部类单例模式测试开始---------------------------");
StaticSingleton instance_2 = StaticSingleton.getInstance();
ByteArrayOutputStream byteArrayOutputStream_2 = new ByteArrayOutputStream();
new ObjectOutputStream(byteArrayOutputStream_2).writeObject(instance_2);
ObjectInputStream objectInputStream_2 = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream_2.toByteArray()));
StaticSingleton singleton_2 = (StaticSingleton) objectInputStream_2.readObject();
//com.songo.singletonpattern.service.StaticSingleton@7cd84586
System.out.println(instance_2);
//com.songo.singletonpattern.service.StaticSingleton@30dae81
System.out.println(singleton_2);
//StaticSingleton test.
singleton_2.singletonFunction();
//序列化和反序列化后是否相同:false
System.out.println("序列化和反序列化后是否相同:" + (instance_2==singleton_2));
System.out.println("----------------静态内部类单例模式测试结束---------------------------");
System.out.println("----------------枚举单例模式测试结束---------------------------------");
SingletonEnum instance_3 = SingletonEnum.INSTANCE;
ByteArrayOutputStream byteArrayOutputStream_3 = new ByteArrayOutputStream();
new ObjectOutputStream(byteArrayOutputStream_3).writeObject(instance_3);
ObjectInputStream objectInputStream_3 =