zoukankan      html  css  js  c++  java
  • 单一设计模式(转)

    单一设计模式,顾名思义就是产生一个对象到单一实例,算是设计模式中最简单也是最容易理解的一种模式了。单一设计模式的设计很简,单目前主要有两种方法,要注意的是要把类到构造函数设为私有的,防止对象可以直接new一个实例出来,下面一种是很常见到一种。

    1. public class SingletonPattern {  
    2. private static SingletonPattern single = null;    
    3. //防止直接产生一个的实例  
    4. private SingletonPattern() {  
    5. }  
    6. public static SingletonPattern getInstance() {  
    7.     if(null == single){  
    8.          single = new SingletonPattern();  
    9.     }  
    10.      return single;  
    11. }  
    12. }  

    这种设计方法,很简单也很清晰,当要产生一个实例的时候,只要调用 SingletonPattern  single = SingletonPattern.getInstance();就可以了。当要产生一个SingletonPattern对象的时候,首先会判断single 是否为null,当第一次产生SingletonPattern对象的时候,single肯定为null,然后就会new 一个SingletonPattern对象来,之后在需要产生SingletonPattern对象的时候,就不会重新new一个新的对象出来,用的还是第一次产生的对象,因为我们的single是一个static变量,所以只会被初始化一次。

        这个方法设计出来的单实例模式,看上去很完美,没有任何瑕疵,但是如果考虑到多线程的话可能就会出现一个很隐晦的bug,也就是说单实例可能会失效,比如,有一个线程调用上面的代码产生一个SingletonPattern 对象S1,同时又有另一个线程也恰好的也要产生一个SingletonPattern 对象S2,我们知道每次产生SingletonPattern对象的时候,都会去判断single是否为null,如果此时在产生S1的时候,single = new SingletongPattern();还没有执行完,另一个线程中的S2,也恰运行到 null == single,这句,但是此时由于single 还没有被赋值所以,产生S2对象的时候,也会进入if的语句里面执行 single = new SingletongPattern();这样就会产生两个实例,就会出现混乱的情况,针对这种情况的发生,第二种产生单实例模式的方法也就出现了

    1. public class SingletonPattern {  
    2. private static final SingletonPattern single = new SingletonPattern();  
    3. //防止直接生成一个实例  
    4. private SingletonPattern(){}  
    5. public synchronized static SingletonPattern getInstance() {  
    6.      return single;  
    7. }  
    8. }  

    这个方法和上面的方法的区别主要

    1、将single 设置成final型,防止被改变

    2、产生对象的时候 用synchronized进行同步处理

    这样就可以很好的解决上面的问题了。

  • 相关阅读:
    两步验证杀手锏:Java 接入 Google 身份验证器实战
    涨姿势:Spring Boot 2.x 启动全过程源码分析
    Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!
    Spring Boot 2.x 启动全过程源码分析(上)入口类剖析
    推荐:7 月份值得一看的 Java 技术干货!
    屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!
    Spring Boot 核心配置文件 bootstrap & application 详解。
    出场率比较高的一道多线程安全面试题
    凉凉了,Eureka 2.x 停止维护,Spring Cloud 何去何从?
    读写Excel
  • 原文地址:https://www.cnblogs.com/kaixinxingfu/p/2749528.html
Copyright © 2011-2022 走看看