创建性模式-单例模式&多例模式

标签(空格分隔): 单例模式 多例模式 饿汉模式 懒汉模式 双检锁


单例模式定义:

保证一个类只有一个实例,并提供一个访问它的全局访问点

若显式的定义构造方法,则系统默认的构造方法就会失效。
所以只需要将这个构造方法定义为私有方法,同时让类自身负责保存它自己的一个实例,这样这个类可以保证无法创建其他实例即可
单例模式需要注意:需要防止在多线程的情况下多个实例同时调用单例类导致生成多个对象的问题
解决方法:
1、懒汉模式 需要实例的时候判断实例是否被初始化,若没有则初始化实例并返回:
懒汉模式需要考虑多线程问题,可以通过加锁解决

懒汉模式

双检锁(双重校验锁):第一个线程在判断newInstance==null时,还没有new出实例时,第二个线程也进来,判断的newInstance也是null,然后也会new出实例,这就不是我们想要的单例模式了,所以就需要加锁,使用synchronized关键字,加锁更能解决安全问题,但加锁同时也会出现一个问题,那就是每次都需要判断锁,导致性能降低。加上双重判断既能解决多线程导致的初始多个实例的问题,也防止了每次访问这个类的时候都需要加锁导致性能降低的问题;
双检锁在一定程度上实现了线程安全且在多线程情况下能保持高性能

2、饿汉模式 将初始化实例的操作作为静态化方法,在类被加载的时候无论需不需要该实例,都将其初始化:

饿汉模式

饿汉模式中,初始化变量的时候最好加上final关键字,将地址锁定保存是唯一的一个对象,更为严谨。

优点: 1、将创建对象的过程隐藏起来,由自己依照特定的规则创建实例,并对创建出来的实例直接负责和管理,2、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 3、确保不同调用者可以获得的是同一个实例,保证数据一致性。


与单例模式相类似,还有多例模式
多例模式:在多例模式中,多例类可以同时拥有有限个实例,但是这些实例必须由多例类自己创建和管理,并通过特定的方法对外提供自己的实例,外界只拥有使用的权利。

多例模式可以认为是一种特殊的单例状态,可以看作这个单例被创建了多次且能实现对这些实例的管理

优点: 1、将创建对象的过程隐藏起来,由自己依照特定的规则创建实例,并对创建出来的实例直接负责和管理。2、多例模式还可以实现实例的重复利用,一旦调用者将调用的实例释放出来,这个实例就可以被转给其他的调用者继续使用,减少内存开销,避免频繁的创建和销毁实例。

多例模式常见于各种数据库连接池、线程池等相关组件中。

推荐阅读更多精彩内容