单例模式、
- 一、单例模式
- 1.1 饿汉模式
- 1.1.1 实现
- 1.1.2 补充
- 1.2 懒汉模式
- 1.2.1 单线程版
- 1.2.2 多线程版
- 二、工厂模式
一、单例模式
单例模式是校招中最常考的设计模式之一。
啥是设计模式?
设计模式好比象棋中的"棋谱":红方当头炮,黑方马来跳… 针对红方的一些走法,黑方应招的时候有一些固定的套路,按照套路来走局势就不会吃亏。
软件开发中也有很多常见的"问题场景",针对这些问题场景,大佬们总结出了一些固定的套路,按照这个套路来实现代码,也不会吃亏。
单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例!
这一点在很多场景上都需要,比如 JDBC 中的 DataSource 实例就只需要一个。
注意: 像这样的需求,不依赖单例模式,就只是靠"君子协定"能不能行?也是可以的!但是人总是避免不了犯错,单例模式就是针对上述的需求场景进行了更强制的保证!当创建出多个实例时,就会编译报错~
单例模式具体的实现方式,分成"饿汉"和"懒汉"两种:
1.1 饿汉模式
1.1.1 实现
类加载的同时,创建实例:
class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
同时构造方法是private私有的,不能在类外创建!:
为什么被叫作"饿汉模式"呢?
1.1.2 补充
y属性是static修饰,静态的;x属性是普通的~:
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); // true!!!
1.2 懒汉模式
1.2.1 单线程版
类加载的时候不创建实例,第一次使用的时候才创建实例:
class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
1.2.2 多线程版
上述讲解的饿汉模式和懒汉模式,如果在多线程环境下调用getInstance,是否是线程安全的?
怎么解决???
使用volatile!!!
volatile 有两个功能:1.解决内存可见性问题;2.禁止指令重排序
代码完全体:
二、工厂模式
举个例子,高中数学课,我们学过笛卡尔坐标系和极坐标系。我们发现,用代码来构造坐标时,两种方法的参数完全一致:
在Java标准库里,有线程池: