23种设计模式之单例模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36090463/article/details/81942701

记得刚出来找工作时,面试官问完几个基础问题后,基本就会马上跳到设计模式问我,问我了解几种设计模式.我说单例模式、工厂方法模式、静态代理模式.他说那你先手写一个单例模式吧.我立马拿出笔和纸手写单例模式,不知道是不是我写的单例模式面试官不满意,还是我写的单例模式和鬼画符一样(面试时你回答问题时字迹工整,从某种程度上可以看出你的态度,我觉得我那时的字迹可能给了面试官一种不重视这次面试的感觉吧),总之最后的结果就是出门左拐.那次回去以后我好好的看了看单例模式,但是一直没有做记录,心中一直想着念着这件事,今日就了结这件事吧!.

一、为什么要使用单例模式

它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间;

能够避免由于操作多个实例导致的逻辑错误;

系统中可能存在一个对象贯穿整个应用程序,此时起到了全局统一管理控制的作用;

二、什么是单例模式

Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点.(简单来说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生)

 创建单例模式注意的点:

 (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。

 (2) 在其内部产生该类的实例化对象,并将其封装成private static类型。

 (3) 定义一个公有的获取实例的静态方法返回该类的实例。

三、如何使用单例模式

实现的方式有如下四种: 

/** 
 *  
 * 单例模式的实现:饿汉式,线程安全 但效率比较低 
 */ 
public class SingletonTest {  

    private static final SingletonTest instance = new SingletonTest();  
   
    private SingletonTest() {  
    }  
   
    public static SingletonTest getInstancei() {  
        return instance;  
    }  
   
} 
/** 
 * 单例模式的实现:懒汉式,非线程安全  
 *  
 */ 
public class SingletonTest {  
    private static SingletonTest instance;  

    private SingletonTest() {  
    }  
   
    public static SingletonTest getInstance() {  
        if (instance == null)  
            instance = new SingletonTest();  
        return instance;  
    }  
} 
/** 
 * 懒汉式,线程安全,但是效率非常低 
 * 
 */ 
public class SingletonTest {  
    private static SingletonTest instance;  

    private SingletonTest() {  
    }  
   
    public static synchronized SingletonTest getInstance() {  
        if (instance == null)  
            instance = new SingletonTest();  
        return instance;  
    }  
} 
/** 
 * 懒汉式,线程安全  并且效率高 
 * 
 */ 
public class SingletonTest {  
    private static SingletonTest instance;  
   
    private SingletonTest() {  
    }  
   
    public static SingletonTest getIstance() {  
        if (instance == null) {  
            synchronized (SingletonTest.class) {  
                if (instance == null) {  
                    instance = new SingletonTest();  
                }  
            }  
        }  
        return instance;  
    }  
} 

四、单例模式使用场景

1.日期工具类获取当前时间.(在做某些业务操作时,经常要设置更新时间,我们不可能每次都去new 当前时间,因为频繁的创建对象会耗费内存.一般都是将日期工具类设置成单例模式,每次需要获取当前时间时,就去获取,这样全局只有一个实例)

2.获取订单号的工具类(订单号是唯一的,一个实例产生的订单号是唯一的,如果多个实例用于产生订单号,容易导致操作多个实例造成逻辑错误

展开阅读全文

没有更多推荐了,返回首页