zoukankan      html  css  js  c++  java
  • 设计模式之单例模式

      单例模式(Singleton Pattern),顾名思义,就是一个类只有一个实例,并且对整个系统提供这个实例
     
    demo1:
     
    public class Singleton {
        private static final Singleton singleton = new Singleton();
        //限制产生多个对象
        private Singleton(){
        }
        //通过该方法获得实例对象
        public static Singleton getSingleton(){
            return singleton;
        }
        //类中其他方法,尽量是static
        public static void doSomething(){
        }
    }
            
    

    有时会把demo1称为饿汉式单例,还有一种是懒汉式单例,也就是需要的时候才创建,仅且只有一个实例,代码如下

    demo2:

    public class Singleton {
          private static final Singleton singleton =null;
          private Singleton(){
          }
         //获得对象
         public static Singleton getSingleton(){
             if(singleton == null){
               singleton = new Singleton();
               }
          return singleton  ;
      }
    
    }
    

     

    应该能看出来demo1与demo2的区别,应该也能看出来demo2存在着线程安全的问题,因此对demo2进一步完善,可以加上Synchronized在方法上,或者在代码块上进行同步安全,代码如下:

    public class Singleton {
          private static final Singleton singleton =null;
          private Singleton(){
          }
         //获得对象
         public static  synchronized Singleton getSingleton(){
             if(singleton == null){
               singleton = new Singleton();
               }
          return singleton  ;
      }
    
    }

     
    单例模式的好处:
      1,减少内存的开销
      2,减少性能的开销
      3,避免对资源的多重占用
      4,单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理
     
    缺点:
      1,没有接口,扩展性难
      2,违反单一职责原则
      3,测试时候需要等对象创建完成
     
    使用场景:
      一个类只有一个对象,对于系统中要求也是
      1,要求生成唯一序列号的环境,
      2,在整个项目中需要一个共享访问点或共享数据。单例则共享对象,可以做到数据的共享,但是要保证线程的安全问题
      3,当创建的对象消耗太大时,可以使用单例模式
      4,系统中使用的是大量的静态的资源的时候可以使用单例
     
     
                                                谢谢大家 ^_^
  • 相关阅读:
    uboot 环境变量
    U-boot的环境变量: bootcmd 和bootargs
    linux中的rootfs/initrd/ramfs/initramfs
    关于Linux启动时挂载rootfs的几种方式
    u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统
    MySQL列出当前月的每一天
    SQL 标量函数-----日期函数 day() 、month()、year()
    mysql 中 DATE_ADD函数和 DATE_SUB函数用法
    mysql 中 DATE_ADD(date,INTERVAL expr type)
    mysql中date_add()函数的使用?
  • 原文地址:https://www.cnblogs.com/gdhzdbh/p/9466656.html
Copyright © 2011-2022 走看看