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

      设计模式是什么?

      设计模式是一种思路,是在前辈们的软件工程中总结出来的套路,并且这些套路已经经过很多项目的测试,是比较成熟的思路,所以现在来总结一下常见的设计模式。

      最简单最常用的就是单例模式:

      一般单例模式包括两种,一种是懒汉式,另外一种是饱汉式的,下面从三个方面来介绍单例模式:

      1,What?

      单例就是单例对象的类只能允许一个实例存在。

      2,  Why?

      很多时候整个系统需要拥有一个全局对象,这样整个系统使用的对象是保持一致的,比如说程序的配置信息,程序的辅助方法等等,其他类要调用这个配置信息或者公共方法的时候,可以通过这个单例类对象来获取。

      3,  How?

      怎么使用这个单例呢?有两种方式,饱汉式和饿汉式,区别是什么呢?饱汉式是加载类时就实现实例化,饿汉式是用的时候才实例化。

      实现思路

      1,将类构造方法定义为私有方法,这样其他类就无法通过调用构造函数来实例化新的对象,并且通过这个类的静态方法来得到这个类的唯一对象。

      2,在类内提供一个静态方法,当外部类调用这个方法的时候,如果类持有的引用不为空就返回这个引用,如果为空则创建这个类的实例。

      可能存在问题

      单线程的时候上面这个思路实现很好,但是现实中有很多程序是多线程的程序,这个时候就会出现多个实例,原因是,当一个线程判断完没有单例对象的时候,要新建一个单例对象,但是在新建完成之前,又来了几个线程也吵着要单例对象,然后发现没有,就都开始建单例对象,这样就出现在这样的问题,建造了多个单例对象,解决方法是什么呢,那就是上一把锁,一把互斥锁。

      下面是常用的

      1,饿汉式,代码如下

     1 public class Gloabl {
     2     private Gloabl() {
     3     }
     4     public static Gloabl getInstance(){
     5         return INSTANCE;
     6     }
     7     //方法一,静态常量
     8     private final static Gloabl INSTANCE = new Gloabl();
     9 //方法二,静态代码块,当类加载的时候自动加载
    10 //    private final static Gloabl INSTANCE ;
    11 //    static {
    12 //        INSTANCE = new Gloabl();
    13 //    }
    14 }
    懒汉式

    优点:写法简单,加载类的时候就自动加载,避免了线程同步的问题

    缺点:在类加载的时候就完成实例化,如果整个过程没有用到这个,则会造成内存资源的浪费,所以,我们需要新的加载方法,懒汉式,用时候再加载,不用不加载

    2,懒汉时,代码如下

    方法一,采用同步锁

     1 public class Gloabl {
     2     private static Gloabl INSTANCE;
     3 
     4     private Gloabl() {
     5     }
     6 
     7     public static Gloabl getInstance() {
     8         if (INSTANCE == null) {
     9             synchronized (Gloabl.class) {
    10                 if (INSTANCE == null) {
    11                     INSTANCE = new Gloabl();
    12                 }
    13             }
    14         }
    15         return INSTANCE;
    16     }
    17 }
    采用同步锁

    方法二,采用静态内部类

     1 public class Gloabl {
     2     private Gloabl() {
     3     }
     4 
     5     private static class GloablInstance{
     6         private static final Gloabl INSTANCES = new Gloabl();
     7     }
     8     
     9     public static Gloabl getInstances(){
    10         return GloablInstance.INSTANCES;
    11     }
    12 }
    采用静态类

    这个是饿汉式的变形版本,只有在调用getInstance方法的时候才来实例化这个实例,静态类只会在第一次加载类的时候初始化,即JVM帮助我们保证了线程的安全性,推荐使用这种方法。

  • 相关阅读:
    zlib编译不过(Error A2070)解决方法(转)
    error C2440: 'static_cast' : cannot convert from 'UINT (__thiscall CStaticLink::* )(CPoint)' to 'LRESULT (__thiscall CWnd::* )(CPoint) (转)
    MFC does not support WINVER less than 0x0501 解决方案(转)
    【程序打包工具 Inno Setup】转
    【Visual Studio】简单内存泄漏检测方法 解决 Detected memory leaks! 问题(转)
    各种版本QT下载地址与VS2013+QT5.3.1环境搭建过程(转)
    【Windows Message】MFC 通过F5,刷新桌面
    [bzoj]3343 教主的魔法
    NOIP2012 国王游戏
    NOIP模拟赛 路面修整
  • 原文地址:https://www.cnblogs.com/ningheshutong/p/6023280.html
Copyright © 2011-2022 走看看