设计模式(五):单例、多例模式

来源:互联网 发布:南京风水 知乎 编辑:程序博客网 时间:2024/06/05 14:56

据说准备期末考试了,复习的时候写一个博客,以备考试专用,本文重点说单例模式。
先看看定义:

单例模式定义

单例模式(Singleton),保证类仅有一个实例,并且提供一个访问它的全局访问点。

多例模式定义

多例模式(Multitude pattern),负责创建、管理自己的多个实例,并且提供它们的全局访问点。

特点

单例模式:

  • 有一个静态私有的实例,保存创建的实例
  • 构造方法私有
  • 获取实例的方法为静态
  • 获取实例时判断是否为空,如果为空,就创建,否则就返回这个存在的实例。

多例模式:

  • 允许有多个实例
  • 多例类自己负责创建、管理自己的实例、并向外界提供自己的实例。

结构图

这里写图片描述

实现Singleton

不好的实现方法一:

public class Singleton {    private static SingleInstance singleInstance;    public static SingleInstance getInstance(){        if(singleInstance==null){//这句在多线程环境下可能会有问题            singleInstance = new SingleInstance();            return singleInstance;         }else            return singleInstance;    }}

上面方法在单线程的时候工作正常,但是在多线程的环境下就会有问题了。如果有多个线程同时访问到if(singleInstance==null)这句代码下,就会有可能多个线程都创建一个实例。在Java中,我们只需要加一个synchronized关键词就可以了。
多线程环境中的解法。

public class Singleton {    private static SingleInstance singleInstance;    public static synchronized SingleInstance getInstance(){        if(singleInstance==null){            singleInstance = new SingleInstance();            return singleInstance;         }else            return singleInstance;    }}

上述代码中,synchronized可以保证临界区被多个线程同时访问到。但是,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定。毕竟,加锁与释放锁都是一个耗时的操作,在没有必要的时候我们尽量避免。
在资源比较紧张的时候,synchronized的性能可能会大大下降。
在实例比较占用空间比较小的情况下,我们可以利用静态构造函数,如下:

public class Singleton {    private static SingleInstance singleInstance = new new SingleInstance();    public static SingleInstance getInstance(){                 return singleInstance;    }}

实现Multitude

多例模式与单例模式最本质的区别就是可以生产多个实例。根据上面的单例模式,我们可以很快写出多例模式的代码:

public class Multitude {    private static MultitudeInstance instances[] = new MultitudeInstance[100];/*这里限制了实例的上限,理论上不设上限,但是在实际的生产中,内存不可能满足*/    public static synchronized MultitudeInstance getInstance(int index){        if(index < 0 || index > 99)            return null;        if(instances[index]==null){            instances[index] = new MultitudeInstance();            return instances[index];        }else            return instances[index];    }}
1 0
原创粉丝点击