1、什么是单例模式
所谓单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
2、单例设计模式分类
分为(1)饿汉式 (2)懒汉式
3、单例设计模式有以下几种方式
(1)饿汉式(静态常量)
(2)饿汉式(静态代码块)
(3)懒汉式(线程不安全)
(4)懒汉式(线程安全,同步方法)
(5)懒汉式(线程安全,同步代码块)
(6)双重检查
(7)静态内部类
(8)枚举
4、单例设计模式实现步骤
4.1 饿汉式单例设计模式实现步骤
①构造器私有 (防止new)
②类的内部创建对象
③向外暴露一个静态的公共方法。getInstance
④代码实现
4.2 懒汉式单例设计模式实现步骤
①构造器私有 (防止new)
②类的内部创建static对象
③向外暴露一个public static的公共方法。getInstance
④代码实现
5、代码实现
5.1 饿汉式(静态常量)
java
public static void main(String[] args) {
//通过方法返回对象
Single instance=Single.getInstance();
System.out.println(instance);
}
class Single{
private String name;
//私有构造器
private Single(String name) {
this.name = name;
}
//创建内部对象实例
private final static Single single=new Single("饿汉式单例设计模式");
//提供一个公有的静态方法,返回实例对象
public static Single getInstance(){
return single;
}
@Override
public String toString() {
return name;
}
}
5.2 饿汉式(静态代码块)
java
public static void main(String[] args) {
//通过方法返回对象
Single instance=Single.getInstance();
System.out.println(instance);
}
class Single{
private String name;
//私有构造器
private Single(String name) {
this.name = name;
}
//创建内部对象实例
private static Single instance;
//在静态代码块中,创建对象实例
static {
instance=new Single("饿汉式单例设计模式");
}
//提供一个公有的静态方法,返回实例对象
public static Single getInstance(){
return instance;
}
@Override
public String toString() {
return name;
}
}
5.3 懒汉式(线程不安全)
java
public static void main(String[] args) {
//通过方法返回对象
Single instance=Single.getInstance();
System.out.println(instance);
}
class Single{
private String name;
//私有构造器
private Single(String name) {
this.name = name;
}
//创建内部对象实例
private static Single instance;
//提供一个静态公有方法,当使用到该方法时,才去创建对象
//即懒汉式
public static Single getInstance(){
//判断是否已经创建了对象
if (instance==null){
//没有就创建对象
instance=new Single("懒汉式");
}
return instance;
}
@Override
public String toString() {
return name;
}
}
5.4 懒汉式(线程安全,同步方法)
java
public static void main(String[] args) {
//通过方法返回对象
Single instance=Single.getInstance();
System.out.println(instance);
}
class Single{
private String name;
//私有构造器
private Single(String name) {
this.name = name;
}
//创建内部对象实例
private static Single instance;
//提供一个静态公有方法,加入同步处理的代码,解决线程安全问题
//即懒汉式
public static synchronized Single getInstance(){
//判断是否已经创建了对象
if (instance==null){
//没有就创建对象
instance=new Single("懒汉式");
}
return instance;
}
@Override
public String toString() {
return name;
}
}
5.5 懒汉式(线程安全,同步代码块)
java
public static void main(String[] args) {
//通过方法返回对象
Single instance=Single.getInstance();
System.out.println(instance);
}
class Single{
private String name;
//私有构造器
private Single(String name) {
this.name = name;
}
//创建内部对象实例
private static Single instance;
//提供一个静态公有方法,当使用到该方法时,才去创建对象
//即懒汉式
public static Single getInstance(){
//判断是否已经创建了对象
if (instance==null) {
//没有就创建对象
synchronized (Single.class) {
instance = new Single("懒汉式");
}
}
return instance;
}
@Override
public String toString() {
return name;
}
}
5.6 双重检查
java
public static void main(String[] args) {
//通过方法返回对象
Single instance=Single.getInstance();
System.out.println(instance);
}
class Single{
private String name;
//私有构造器
private Single(String name) {
this.name = name;
}
//创建内部对象实例
private static Single instance;
//提供一个静态公有方法,加入了双重检查代码,解决了线程安全问题,同时解决了懒汉式加载问题
//保证了效率,推荐使用
public static Single getInstance(){
//判断是否已经创建了对象
if (instance==null) {
//没有就创建对象
synchronized (Single.class) {
if (instance == null) {
instance = new Single("懒汉式");
}
}
}
return instance;
}
@Override
public String toString() {
return name;
}
}