ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式——单例模式

2019-06-26 22:02:51  阅读:145  来源: 互联网

标签:getInstance SingleTon01 SingleTon02 模式 实例 单例 设计模式 public


1、单例模式定义

  单例模式可定义为:一个类只有一个实例,并且该类能够自行创建此实例的模式。在Java中,单例模式可以保证一个类在JVM中只有一个实例对象存在。

2、单例模式特点

  (1)由于单例模式只生成一个实例对象,所以减小了系统的性能开销。尤其是对于创建实例对象消耗资源较多的类,此好处更加明显。

  (2)由于不是采用new操作符的方式创建类的实例对象,所以不用频繁的在系统内存中开辟内存创建实例以及进行GC操纵,也即降低了系统内存的使用频率,减小了GC压力。

  (3)单例类对外提供一个访问该单例的全局访问点,优化了共享资源的访问方式。

3、单例模式的实现和分析

  (1)饿汉式实现单例模式

    饿汉式实现的特点是在类加载的时候就开始创建一个实例,具体代码如下:

package com.singleton;
public class SingleTon01 {
    //类初始化的时候立即初始化instance对象
    private static SingleTon01 instance = new SingleTon01();
    private SingleTon01() {}
    //getInstance方法没有同步,所以效率较高
    public static SingleTon01 getInstace() {
        return instance;
    }
}

  (2)分析:

    (1)instance是静态私有变量,保证了只能在类内部访问,而且在类加载的时候创建实例对象

    (2)类的构造方法是私有的,这一点很重要,一般类的构造方法是共有的,从而保证在程序中可以使用new操作符来创建类的对象。但是在单例模式中不允许通过new来创建对象(否则可能会出现多个实例,违反了单例的定义),所以要把类的构造方式设置为private。

    (3)getInstance方法需要设置为public,也即对外提供一个共有的方法来创建或获取该静态私有实例

  (3)测试

package com.singleton;
public class Client {
    public static void main(String[] args) {//饿汉式单例模式实现
        //此处创建两个SingleTon01类的对象,打印输出查看是否是同一个对象,如果输出的是同一个对象,则满足单例要求
        //因为SingleTon01中的getInstance给定义为static方法,所以使用的时候通过类名来调用
        SingleTon01 s1 = SingleTon01.getInstace();
        SingleTon01 s2 = SingleTon01.getInstace();
        System.out.println(s1);
        System.out.println(s2);       
    }
}

  (4)运行结果:

com.singleton.SingleTon01@15db9742
com.singleton.SingleTon01@15db9742

  打印结果一样,证明了两个对象是同一个对象。

 

  (2)懒汉式实现单例模式

    (1)懒汉式实现单例模式

      懒汉式实现的特点是在类加载的时候没有创建实例,而是在实际使用(也即第一次调用getInstance方法)的时候再去创建实例,也即所谓的延迟加载。

package com.singleton;
//此案例为懒汉模式,也即在创建类的时候没有立即加载对象,而是进行延迟加载
public class SingleTon02 {
    //也是静态私有对象,但是不进行初始化
    private static SingleTon02 instance;
    private SingleTon02() {}
    //对方法进行同步,保证了唯一性,并发性降低了
    public static synchronized SingleTon02 getInstance() {
        if(instance == null) {
            instance = new SingleTon02();
        }
        return instance;
    }
}

    (2)分析

      getInstance方法被synchronized修饰符所修饰,在多线程环境下也能保证线程安全。但是会影响系统的性能。

    (3)测试

package com.singleton;
public class Client {
    public static void main(String[] args) {//懒汉式单例模式实现
        SingleTon02 s1 = SingleTon02.getInstance();
        SingleTon02 s2 = SingleTon02.getInstance();
        System.out.println(s1);
        System.out.println(s2);        
    }
}

    (4)运行结果

com.singleton.SingleTon02@15db9742
com.singleton.SingleTon02@15db9742

 

  (3)静态内部类实现单例模式

    

标签:getInstance,SingleTon01,SingleTon02,模式,实例,单例,设计模式,public
来源: https://www.cnblogs.com/xwwbb/p/11094141.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有