基础知识--------常用的设计模式之单例模式
程序员文章站
2022-06-17 17:59:56
...
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
1995 年,GoF(Gang of Four,四人组/*)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。
这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。
当然,软件设计模式只是一个引导,在实际的软件开发中,必须根据具体的需求来选择:
- 对于简单的程序,可能写一个简单的算法要比引入某种设计模式更加容易;
- 但是对于大型项目开发或者框架设计,用设计模式来组织代码显然更好。
单例指的是单个实例,简单来说就是我在程序中有一个类,它没有必要或者不能在每次需要的时候就去new一个新的对象,我要求他在全局中只有唯一的实例就行。为了安全考虑,我们不能再将创建实例的权限交给其他类,所以我们需要在单例类内部创建一个私有的构造函数,以后需要获得单例实例则通过getInstance方法来获取。那此时我们就可以用单例来设计他,这里就有一个问题:我们在哪一个时间点去创建这个对象,根据new的时间点的不同,我们又可以将它分为懒汉式和饿汉式。
懒汉式:用到的时候创建实例
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized 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 static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
双重校验锁:强化线程安全
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
总结:单例模式的实现方法还是很多的,除上述的几种实现方式外还有枚举式,可以按照项目需求来进行选用,我一般采用的是饿汉式和静态内部类的方式