设计模式之单例模式

原创 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来修饰,构造器前面的修饰符可以控制该类对于其它类的可见程度!

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

大话设计模式——单例模式

宏观导图 细节展示  单例模式的结构图: 关键代码:  在GetInstance方法中,要加入判断。 if (instance==null) { instance=new Single...
  • u011500356
  • u011500356
  • 2015年01月05日 21:44
  • 1474

java 单例设计模式使用场景

单例设计模式的使用场景说明,优缺点,在线程中该使用那种方式的单例,其中涉及到类在JVM中的分配......
  • bob_Xing_Yang
  • bob_Xing_Yang
  • 2017年05月23日 10:53
  • 387

Android面试设计模式之单例模式

在面试的时候面试官会问我们常用的一些设计模式,这里先介绍一下单例模式。 为什么要使用单例模式 1.控制资源的使用,通过线程同步来控制资源的并发访问; 2.控制实例产生的数量,达到节约系统资源; 3...
  • qq_435559203
  • qq_435559203
  • 2016年09月12日 18:25
  • 582

设计模式之——单例模式(Singleton)的实现、优缺点和常见应用场景

一.单例模式的三种实现 以及各自的优缺点 转载自http://my.oschina.net/suyewanwan/blog/102525 单例模式:单例模式的意思就是只有一个实例。单例模式确保某...
  • qq_30465427
  • qq_30465427
  • 2015年08月09日 15:36
  • 1210

设计模式系列(一)单例模式

一、简单介绍 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。 《设计模式》书中对单例模式动机的介绍 对于系统中的某些类...
  • robertcpp
  • robertcpp
  • 2016年06月05日 11:00
  • 2270

C++设计模式[二]单例模式

接着就是单例模式;个人理解就是把创建方法改为私有,然后再内部实例化,禁止外部创建对象。 何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个...
  • langb2014
  • langb2014
  • 2015年11月03日 16:11
  • 1083

设计模式(创建型)之单例模式(Singleton Pattern)

单例模式可能是23种设计模式中最简单的。应用也非常广泛,譬如Android中的数据库访问等操作都可以运用单例模式。核心概念: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称...
  • yanbober
  • yanbober
  • 2015年04月27日 16:50
  • 2678

设计模式:单例模式(Singleton)

单例模式在23个设计模式中算得上是最简单的一个了,也行你会有异议,那就换成“最简单之一”,这样就严谨了很多。   单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。   适用性:当类...
  • u013256816
  • u013256816
  • 2016年03月23日 21:37
  • 4949

使用Object-C实现23种设计模式之单例模式

今天给大家讲解一下第四种创建模式——单例模式,单例模式不同于前几种,前几种更注重逻辑,而单例模式则偏重于内存管理以及实际运用,相对前几种要相对简单。 所谓单例模式,就是一种让某个类只产生单一实例的模式...
  • u013054715
  • u013054715
  • 2016年05月23日 22:43
  • 4403

浅谈常见设计模式--单例模式 简单工厂模式

今题那站在这里和大家一起分享最近在一本书上看到的关于设计模式的内容,接下来要讲的设计模式有: 单例模式 简单工厂模式 工厂方法和抽象工厂 代理模式 命令模式 策略模式 门面模式 桥接模式 观察者模式 ...
  • xikai18827083487
  • xikai18827083487
  • 2016年11月13日 17:04
  • 989
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之单例模式
举报原因:
原因补充:

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