`
安卓干货铺
  • 浏览: 36222 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

设计模式(1)-单例模式

阅读更多

 

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例

普通的单例模式写法如下:

//只有内部类可以为static。
public class Singleton{
    //在自己内部定义自己的一个实例,只供内部调用  
       private static final Singleton instance = new Singleton();
           private Singleton(){
               }
               //这里提供了一个供外部访问本class的静态方法,可以直接访问    
  public static Singleton getInstance(){  
         return instance;  
            } }

单例模式的优点

(1).由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。 

(2).由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,比如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决。 

(3).单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。 

(4).单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。

 

单例模式的缺点

 

(1).单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。 

(2).单例对象如果持有Context,那么很容易引发内存泄露,此时需要注意传给单例对象的Context最好是Application Context。

 

单例模式的七种写法

1.(懒汉,线程不安全):

public class Singleton {        private static Singleton instance;        private Singleton (){}        public static Singleton getInstance() {        if (instance == null) {            instance = new Singleton();        }       return instance;       }   }

这种写法在多线程不能正常工作。

 

2.(懒汉,线程安全):

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

这种写法能够在多线程中很好的工作,但是效率很低,99%情况下不需要同步。

 

3.(饿汉):

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

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的。

 

4. 双重检查模式 (DCL)

public class Singleton {        private volatile static Singleton singleton;        private Singleton (){}        public static Singleton getSingleton() {        if (singleton == null) {            synchronized (Singleton.class) {            if (singleton == null) {                singleton = new Singleton();            }           }       }       return singleton;       }   }

这种写法在getSingleton方法中对singleton进行了两次判空,第一次是为了不必要的同步,第二次是在singleton等于null的情况下才创建实例。DCL优点是资源利用率高,第一次执行getInstance时单例对象才被实例化,效率高。缺点是第一次加载时反应稍慢一些,而且有失效的可能。

 

5. 静态内部类

public class Singleton {        private static class SingletonHolder {        private static final Singleton INSTANCE = new Singleton();        }        private Singleton (){}      public static final Singleton getInstance() {            return SingletonHolder.INSTANCE;        }    }

第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,很合理的单例模式。

 

6. 枚举

public enum Singleton {       INSTANCE;       public void whateverMethod() {       }   }

7. 使用容器

public class SingletonManager {
   private static Map<String, Object> objMap = new HashMap<String,Object>();//使用HashMap作为缓存容器  
    private Singleton() {
       }  
public static void registerService(String key, Objectinstance) {
       if (!objMap.containsKey(key) ) {
       objMap.put(key, instance) ;//第一次是存入Map
           }
             }  
public static ObjectgetService(String key) {  
       return objMap.get(key) ;//返回与key相对应的对象
         } }

用SingletonManager 将多种的单例类统一管理,在使用时根据key获取对象对应类型的对象。用户使用时只需要根据key来获取到对应的ServiceFetcher,然后通过ServiceFetcher对象的getService函数获取具体的服务对象。当第一次获取时,会调用ServiceFetcher的creatService函数创建服务对象,然后将该对象缓存到一个列表中,下次再取时直接从缓存中获取,避免重复创建对象,从而达到单例的效果。Android中的系统核心服务以单例形式存在,减少了资源消耗。

 

 

总结:

不管以哪种形式实现单例模式,它们的核心原理是将构造函数私有化,并且通过静态公有方法获取一个唯一的实例,在这个获取的过程中必须保证线程的安全,同时也要防止单例对象的资源消耗。

 

我的微信公众号:安卓干货铺

专注于Android技术分享,从起步到进阶,坚持原创,认真总结每一个阶段的技术干货,包括面试、设计模式架构,性能优化、技术功能实现等;不仅如此,还会分享一些职场经验感悟。每个月都会争取送书活动给大家。

 

我建立一个Android新人交流群,如果你是Android刚入门或者打算学习Android可以加一下:

 群号:458739310

 

0
0
分享到:
评论

相关推荐

    java设计模式----单例模式

    在Java编程语言中,设计模式是一种经过验证的解决常见软件设计问题的最佳实践。单例模式是其中最常用的一种,它的核心思想是确保一个类只有一个实例,并提供全局访问点。单例模式的应用场景包括:控制资源的访问、...

    C++设计模式-单例模式

    李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。

    设计模式-单例模式脑图

    设计模式-单例模式脑图

    JAVA-设计模式-创建型模式-单例模式

    JAVA-设计模式-创建型模式-单例模式

    设计模式--单例模式java例子

    单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制实例的数量,减少资源消耗,同时便于协调整个...

    Java设计模式-单例模式详解

    Java设计模式-单例模式详解 单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 ...

    优秀的设计模式示例-单例模式

    单例模式是软件设计模式中的一种经典模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。以下是对单例模式的详细...

    ava常用设计模式-单例模式

    ava常用设计模式-单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一...

    设计模式ForiOS-02-单例模式实用.pdf

    设计模式ForiOS-02-单例模式实用.pdf

    常见设计模式-单例模式

    设计模式-单例模式 单例模式是一种常见的设计模式,它的主要作用是确保在内存中仅创建一次对象,并提供一个全局访问点。单例模式有两种类型:饿汉类型和懒汉类型。 饿汉类型的单例模式是在类加载时创建对象,例如...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    通过“创建模式-1.单例模式”和“创建模式-2.简单工厂模式”这两个文件,你将能看到如何在实际项目中应用这些模式,从而加深理解和实践。在阅读源代码的过程中,注意观察如何通过类的组织和方法的设计来实现这些模式...

    设计模式-单例设计模式

    单例模式是一种常见的创建型设计模式,其核心思想在于确保一个类仅有一个实例存在,并且该实例由该类自行创建,随后向整个系统提供这一唯一实例。 #### 类图解析 在设计模式中,类图是一种直观展示类结构及关系的...

    iOS 设计模式 -单例

    1. **唯一实例**:这是单例模式的核心特性,确保类的实例在整个程序生命周期内只有一个。这通常通过私有化构造函数来实现,防止外部直接创建对象。 2. **自我实例化**:类本身负责创建自己的实例。这个过程通常包含...

    PHP5设计模式-单例模式

    单例模式是一种常用的设计模式,它在软件工程中扮演着控制类实例化过程的角色,确保一个类只有一个实例,并提供全局访问点。这种模式在PHP中尤其常见,特别是在需要频繁实例化然后销毁的对象,或者需要控制共享资源...

    android-设计模式-单例模式(干货)

    android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫

    1.设计模式-单例设计模式1

    单例设计模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式通常有多种方式,包括懒汉模式、饿汉模式、静态内部类以及枚举类型。 1. **懒汉模式**: 懒汉...

    设计模式实验报告-单例模式 .docx

    设计模式实验报告

    java设计模式-单例.pdf

    ### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...

Global site tag (gtag.js) - Google Analytics