大家好,欢迎来到程序视点!
前言
在前面三期里,我们详细讲解了工厂模式下的三种分类:
其中,简单工厂模式不是我们23中设计模式之气,其他两个设计模式都属于创建型模式
的设计方式。
今天,我们要接着讲另一种创建型模式:单例模式
。
单例模式简介
单例模式是比较常见的一种设计模式,目的是保证一个类只能有一个实例。
这个实例就是其唯一的对象,可以直接访问,不需要在其他地方实例化该类的对象。
注意三点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
关键代码有两点:
- 私有构造函数
- 对外暴露获取唯一实例的方法
示例
关于单例模式的创建,我们不得不了解其中的两种方式:懒汉式和饿汉式。
首先来看懒汉式
。之所以取这个名称,是因为类的实例并不是一开始就创建好的,而是“懒”到第一次获取的时候才创建。
public class Singleton {
//构造函数私有化
private Singleton(){}
//“懒”就懒在这里。可以对比后面的饿汉式。
private static Singleton singleton = null;
//暴露获取唯一实例的方法
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
这种方式是最基本的实现方式。但这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized
,所以严格意义上它并不算单例模式。
由于线程安全并不是我们要讲的主要内容,这里就不展开分析了
ps:在我们后面讲多线的时候,会详细分析。敬请期待!
再来看看饿汉式
。这和上面的懒汉式不同:它是直接一开始就创建好一个实例化的对象。不会管这个实例会不会立即被使用。
class Singleton2 {
//私有构造函数
private Singleton2(){};
// 太“饿”了,得先new个实例先垫下
private static Singleton2 singleton2= new Singleton2();
//暴露获取唯一实例的方法
public static Singleton2 getSingleton2(){
return singleton2;
}
}
这种方式比较常用。同时不用去考虑加锁的问题,执行效率会高些!但有个缺点:类加载时就初始化,浪费内存。
标签:private,实例,static,能看懂,单例,新手,模式,class From: https://www.cnblogs.com/tanggoahead/p/17818421.html