创建型设计模式-单例模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
在介绍设计模式的前提下我觉得对基于设计模式的六大原则应该有所了解:
1、开闭原则(open close Principle)
在面向对象的编程领域当中,开闭原则规定尽量做到"软件中的对象(类、模块、函数等等)应该对于扩展是开放的,但是对于修改是封闭的"这意味着一个实体是允许不改变它的源码的前提下变更它的行为。该特性在 产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审核,单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。
2、里氏代换原则(Liskov Substitution Principle LSP)
- 单例模式
// 饿汉模式
package singlemodel;
/**
* 饿汉式
* @Auther: ZQB
* Date:2020/1/19
*/
public class Singleton1 {
private static Singleton1 instace = new Singleton1();
private Singleton1(){}
//类加载线程安全,方法没有同步调用效率高。
public static Singleton1 getInstance(){
return instace;
}
}
//懒汉模式
package singlemodel;
/**
* 懒汉式
* @Auther: ZQB
* Date:2020/1/19
*/
/**
* 懒汉式模式
* @Auther: ZQB
* Date:2020/1/19
*/
public class Singleton2 {
private static Singleton2 instance;
private Singleton2(){}
//线程不安全需要添加synchronized同步块,调用效率低
public static synchronized Singleton2 getInstance(){
if (instance == null){
instance=new Singleton2();
}
return instance;
}
}
// 静态内部类的方式加载
package singlemodel;
/**
* 静态内部类
* @Auther: ZQB
* Date:2020/1/19
*/
public class Singleton4 {
//当进行类初始化的时候,不会初始其静态内部类,实现了延时加载
private static class SingletonClassInstance{
private static final Singleton4 instance = new Singleton4();
}
public static Singleton4 getInstance(){
return SingletonClassInstance.instance;
}
private Singleton4(){}
}
// 双重检测锁模式
package singlemodel;
/**
* 双重检测锁模式
* @Auther: ZQB
* Date:2020/1/19
*/
/**
* 双重检测锁模式
* @Auther: ZQB
* Date:2020/1/19
*/
public class Singleton3 {
private static volatile Singleton3 instace = null;
public static Singleton3 getInstance(){
if(instace == null){
Singleton3 sc;
synchronized (Singleton3.class){
sc = instace;
if (sc == null){
synchronized (Singleton3.class){
if (sc == null){
sc = new Singleton3();
}
}
instace = sc;
}
}
}
return instace;
}
private Singleton3(){}
public static void main(String[] args){
Singleton3 singleton3 = Singleton3.getInstance();
Singleton3 singleton31 = Singleton3.getInstance();
System.out.println(singleton3);
System.out.println(singleton31);
}
}
注意:通过反射和序列化可以获取单例模式的对象