23种设计模式:单例设计模式(饿汉式 VS 懒汉式)
每博一文案
世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了。
但当我们咬牙坚持过那段难熬的时光后,发现并没有想象中的那么难,就像村上春树说的一句话:每个人
的生命中都有最艰难的那一年,等你迈过去了,人生就会变得高远,辽阔,生活总是泥沙俱下,每个看似百毒不侵的
成年人,都有无数次绝望和崩溃的时刻,要走的路已经选定了,该怎么走,走多久,都是命中注定的,走多久都是命中注定。
在一切变好之前,我们总要经历一段不开心的日子。这段日子也许很长,也许只是一觉醒来,人只有不断地经历,跌倒后,
才能顽强与坚毅的性格。
作家三毛说过这样一句话:世间的人和事,来和去都有它的时间,我们只需要把自己修炼成最好的样子,然后静静地去等待就好了。
人生在世,每个人,都有自己的困境,每个人都有自己的深渊,每个人都有可能摔进去,但每个生命都有属于自己绽放时刻。
这一生挫折会来,也会过去,热泪会留下,也会收起,每个阳光下开怀大笑的人,都有一段沉默的时光。
当我们走过难熬的岁月。回首往昔,当初的脆弱,早已变成勇敢,成为了我们攻坚克难的坚硬的铠甲。
愿你纵使孤身一人,也可以将这场生命旅程走得光灿明亮,自由坦荡。
—————— 一禅心灵庙语
文章目录
- 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)
- 每博一文案
- 1. 单例设计模式
- 1.1 单例设计模式的优点
- 1.2 单例设计模式的应用场景
- 2. 单例设计模式:饿汉式
- 2.1 饿汉式的优缺点:
- 3. 单例设计模式:懒汉式
- 3.1 懒汉式的优缺点:
- 4. 总结:
- 5. 最后:
1. 单例设计模式
设计模式: 是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。设计模式免去了我们自己再思考和摸索。就像经典的棋谱,不同的棋局,我们用不同的棋谱,”套路“,也像数学中的公式,不同的问题使用不同的套用不同的公式。
所谓类的单例设计模式 : 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例 ,并且该类只提供一个取得其对象的实例的方法。
如果我们要让在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为 private
,这样,就不能用 new
操作符
在类的外部产生 类的对象了。但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象(因为我们把构造方法权限改为了 private) ,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
常见的单例设计模式的类:Runtime
单例设计模式有两个实现的方式:饿汉式 和 懒汉式。
1.1 单例设计模式的优点
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决,比如:数据库连接池。一个应用只需要一个数据库连接池就足够了。
1.2 单例设计模式的应用场景
网站的计数器: 一般也是单例模式实现,否则难以同步。
应用程序的日志应用: 一般都使用单例模式实现,这一般是由于共享的日志文件,一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
数据库连接池的设计: 也是采用单例模式,因为数据库连接是一种数据库资源。
项目中读取配置文件的类 ,一般也只有一个对象,没有必要每次使用配置文件数据,都生成一个对象去读取。
Application 也是单例的典型应用。
Windows 的 **Task Manager(任务管理器)**就是很典型的单例模式
Windows 的 Recycle Bin(回收站) 也是典型的单例应用,在整个系统运行过程中,回收站一直维护着仅有的一个实例。
2. 单例设计模式:饿汉式
饿汉式的实现方式一:
package blogs.blog2;
public class SingletonTest {
public static void main(String[] args) {
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
}
}
// 饿汉式方式以
class Bank{
// 构造器私有化,不然外部调用
private Bank() {
}
// 内部创建实例化对象
//必须 stiatic 静态的和类一起加载到内存(方法区)当中,并且仅仅只是加载一次而已,如果不是静态的创建一个对象就创建一个了。
private static Bank instance = new Bank();
// 提供公共静态的方法,返回当前类的对象(因为对应的属性是静态的了,方法也要是静态的)
public static Bank getInstance() {
return instance;
}
}
因为获取的对象都是来自同一个地方。所以地址是一样的
饿汉式实现的方式二: 不提供,公共的静态方法,将创建的对象public 公开化。
package blogs.blog2;
public class SingletonTest {
public static void main(String[] args) {
Bank bank1 = Bank.instance;
Bank bank2 = Bank.instance;
// Bank.instance = null; // fianl 无法修改
System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
}
}
// 饿汉式方式以
class Bank{
// 构造器私有化,不然外部调用
private Bank() {
}
// 内部创建实例化对象
// 必须 stiatic 静态的和类一起加载到内存(方法区)当中,并且仅仅只是加载一次而已
// 注意附加上 final 防止外部访问修改为了 null,
public static final Bank instance = new Bank();
// 提供公共静态的方法,返回当前类的对象
}
2.1 饿汉式的优缺点:
- 优点: 线程安全
- 缺点: 对象加载时间过长
3. 单例设计模式:懒汉式
懒汉式实现如下:
package blogs.blog2;
public class SingletonTest {
public static void main(String[] args) {
Bank bank1 = Bank.getInstance();
Bank bank2 = Bank.getInstance();
// Bank.instance = null; // fianl 无法修改
System.out.println(bank1 == bank2); // == 操作符,引用类型比较的是地址
}
}
// 饿汉式方式以
class Bank{
// 构造器私有化,不然外部调用
private Bank() {
}
// 静态的好通过 类名直接调用
// 注意附加上 final 防止外部访问修改为了 null,
private static Bank instance = null;
// 提供公共静态的方法,返回当前类的对象
public static Bank getInstance() {
if(instance == null) { // 当 instance 为 null 的时候,就创建新的不是空就不创建新的对象
// 内部创建实例化对象
instance = new Bank();
}
return instance;
}
}
3.1 懒汉式的优缺点:
- 优点: 延迟对象的创建,有需要就创建
- 缺点: 目前的方式,存在线程不安全问题
4. 总结:
- 单例设计模式:就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象的实例的方法。
- 单例设计模式两种表现形式:饿汉式 VS 懒汉式
- 单例设计模式注意使用 static 修饰实例变量,静态的和类一起加载到内存(方法区)当中,仅仅只加载一次,所有对象共有。
- 注意饿汉式的第二种实现的方式:使用 final 关键字,防止被外部调用修改置为了 null
5. 最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后悔有期,江湖再见!!!