设计模式之单例模式

原创 2015年11月21日 17:36:10

一、定义:保证某个类在实现的时候只能产生一个实例的模式
二、实现方法:有两种实现方法,懒汉式和饿汉式。
1、懒汉式实现方式
特点:在程序第一次调用getInstence的时候实现实例的产生
优点:只有在使用到这个类的时候才会去实例化,这样可以更好的节省内存资源
缺点:不是线程安全的,在多线程中可能会实例化不止一个。假设有两个线程A、B都要创建一个实例,A调用getInstance,
发现singleton是null,此时B线程获得CPU控制权,发现singleton也是空的,这样A和B就各自创建一个实例,(而且后面
创建的应该会把前面创建的覆盖)

    public class Singleton1 {
    public static Singleton1 singleton = null ;
    public int index = 0 ;
    public static Singleton1 getInstance() {
        if(singleton == null){
            singleton = new Singleton1();
        }
        return singleton ;
    }
    private Singleton1(){

    }
    public void setIndex(int i) {
        this.index = i ;
    }
    public void test(String name) {
        System.out.println("单例模式实例"+name+":"+index);
    }
}
    修改:对getInstance方法进行改进,加入线程锁
    public class Singleton1 {
    public static Singleton1 singleton = null ;
    public int index = 0 ;
    public static synchronized Singleton1 getInstance() {
        if(singleton == null){
            singleton = new Singleton1();
        }
        return singleton ;
    }
    private Singleton1(){

    }
    public void setIndex(int i) {
        this.index = i ;
    }
    public void test(String name) {
        System.out.println("单例模式实例"+name+":"+index);
    }
}
    2、饿汉式实现方式    
       优点:在程序初始化的时候就将类实例化,所以是线程安全的
       缺点:如果这个类在以后用不着,那么就会造成内存资源的浪费
    public class Singleton2 {
    private int index = 0 ;
    public static Singleton2 singleton = null ;
    static{
        singleton = new Singleton2(); 
    }
    public static Singleton2 getInstance() {
        return singleton ;
    }
    private Singleton2(){

    }
    public void setIndex(int i) {
        this.index = i ;
    }
    public void test(String name) {
        System.out.println("单例模式实例"+name+":"+index);    
    }
}

三、拓展:控制实例限定个数的类
思路:利用一个私有的static int 变量来控制可以创建的实例数量

    public class Singleton3 {
    public static Map<String, Singleton3> map = new HashMap<String, Singleton3>();
    private static int cancreate = 5 ;
    public static synchronized Singleton3 getInstance(String name) {
        if(!map.containsKey(name)&&cancreate!=0){
            map.put(name, new Singleton3());
            cancreate--;
        }else if(cancreate == 0){
            System.out.println(Singleton3.class.getName()+"可创建数量已达上限!");
            return null ;
        }
        return map.get(name);
    }

    private Singleton3(){};


}

四、单例模式的优缺点
1、优点
1.1 在内存中只有一个实例,节省资源
1.2 可以在类中使用全局共享的变量或者资源(这个以前没看设计模式的时候其实就已经用了,在一个类里面只有全局共享的
static变量)
2、缺点
2.1 单例模式一般没有接口,所以要扩展就很难(给单例模式的类增加接口是没有意义的,因为加来加去也只能实例化一次,
那接口和类中自带的方法有什么区别呢?)
2.2 测试不方便(这个具体还不是很秦楚)

五、感想
以前从来没想过原来构造器前面可以加private来修饰,构造器前面的修饰符可以控制该类对于其它类的可见程度!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

设计模式学习之单例模式

  • 2013年12月11日 21:43
  • 5KB
  • 下载

23钟设计模式之单例模式

  • 2013年08月13日 10:41
  • 26KB
  • 下载

Java设计模式之单例模式

场景问题业内都有一个不朽的传说,就是程序员是找不到女朋友的。没有女朋友怎么行。今天咱就带着大家用Java的知识,来”追”一个女朋友。 那在追女友之间阿,咱先定一个女友的标准。不过,这个标准不能乱定是...
  • ryffic
  • ryffic
  • 2016年01月19日 22:54
  • 524

设计模式之单例模式程序

  • 2010年05月18日 10:28
  • 3KB
  • 下载

java设计模式之单例模式详解

  • 2012年11月02日 17:53
  • 33KB
  • 下载

PHP设计模式之单例模式简单代码介绍

PHP设计模式之单例模式 单例模式是一种创建型模式,它会限制应用程序,使其只能创建某一特定类类型的一个单一的实例。举例来说,一个web站点将会需要一个数据库连接对象,但是应该有且只能有一个,因此我们...

设计模式单例模式

  • 2014年10月10日 20:56
  • 4KB
  • 下载

Android 设计模式 笔记 - 单例模式

定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 实现单例模式的关键点: 构造函数不对外开放通过静态方法或者枚举返回单例类对象。确保单例类的对象只有一个,不管是不是...

设计模式之单例模式

  • 2012年04月10日 17:38
  • 728B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之单例模式
举报原因:
原因补充:

(最多只允许输入30个字)