• 单例模式


    设计模式:

         在软件开发中,经过大家公认的,用于在特定环境下特定问题的解决方案,不是具体的代码,而是实际情景中的解决方案。

    几乎所有模式有以下面向对象原则:

    1.对接口编程而不是对实现编程

    面向接口编程:解耦,增强扩展性

    2.优先使用对象组合而不是继承

    设计模式的三大类:创建型模式,结构型模式,行为型模式

    何为创建型模式:

           把复杂对象的创建过程加以抽象,通过子类继承和重写方法,来得到具有复合属性的对象。

    单例模式:

    一个对象只有一个实例,如:数据库操作,线程池,配置文件等等,属于全局资源。

    有以下特点:

         1,一个单例类只能有一个实例;

         2,必须自己创建实例,使用时不需要考虑创建细节

         3,单例类向整个系统提供唯一的实例; 

    优点:有利于节约内存空间,为整个框架提供共享变量,提高代码的重用性

    运用场景:

    1,资源共享的情况下,避免由于资源操作时导致的性能或损耗,如配置文件;

    2,控制资源的情况下,方便资源的互相通信,如线程池;

    单例模式的几种实现方式:饿汉式,懒汉式,双重验证式,类加载式,枚举式;

    饿汉式:

    代码: 

    package org.yl;
    
    /**
     * Created by yelei on 17-4-7.
     */
    //饿汉式
    public class SingletonClass {
    
        private static SingletonClass ONE=new SingletonClass();
        //私有构造器,只能类部访问,不能被实例化和继承
        private SingletonClass(){}
        //通过这个方法返回实例
        public static SingletonClass getInstance(){
            return ONE;
        }
       /* public void show(){
            System.out.println("饿汉式");
        }*/
    }

    测试类:

    package org.yl;
    
    /**
     * Created by yelei on 17-4-7.
     */
    public class Test {
        public static void main(String[] args) {
            SingletonClass a=SingletonClass.getInstance();
            SingletonClass b=SingletonClass.getInstance();
            Z z1=new Z();
            Z z2=new Z();
            if (a==b){
                System.out.println("a==b");
            }
            if (z1!=z2){
                System.out.println("z1!=z2");
            }
        }
    }

    运行结果:

    a==b
    z1~=z2
    
    Process finished with exit code 0

    饿汉式的优点:不存在线程安全;

        缺点:项目已启动就创建,不能控制其创建的时间,也就是不能延迟创建。

    懒汉式:

    代码:

    package org.yl;
    
    /**
     * Created by yelei on 17-4-7.
     */
    //饿汉式
    public class SingletonClass {
        //这里先不创建实例
        private static SingletonClass ONE;
        //私有构造器,只能类部访问,不能被实例化和继承
        private SingletonClass(){}
        //通过这个方法返回实例
        public static SingletonClass getInstance(){
            //先判断是否已经创建了实例
            if (ONE==null){
                ONE=new SingletonClass();
            }
            return ONE;
        }
       /* public void show(){
            System.out.println("饿汉式");
        }*/
    }

    测试代码和运行结果和前面一致;

    饿汉式的优点:可以延迟创建对象,缺点是会存在线程安全问题,所以有加锁的懒汉式:

     public synchronized static SingletonClass getInstance(){
            //先判断是否已经创建了实例
            if (ONE==null){
                ONE=new SingletonClass();
            }
            return ONE;
        }

    加锁饿汉式的优点可以解决线程安全问题,但是同步效率低,每次使用ONE都必须同步等待。

  • 相关阅读:
    【转】编写高质量代码改善C#程序的157个建议——建议61:避免在finally内撰写无效代码
    【转】编写高质量代码改善C#程序的157个建议——建议60:重新引发异常时使用Inner Exception
    【转】编写高质量代码改善C#程序的157个建议——建议59:不要在不恰当的场合下引发异常
    【转】编写高质量代码改善C#程序的157个建议——建议58:用抛出异常代替返回错误代码
    【转】编写高质量代码改善C#程序的157个建议——建议57:实现ISerializable的子类型应负责父类的序列化
    elasticsearch从入门到出门-02-简单的CRUD
    elasticsearch从入门到出门-01windows上安装使用
    Idea 使用的技巧和设置
    Ubuntu16.04 安装搜狗输入法
    Ubuntu 下安装JDK1.8
  • 原文地址:https://www.cnblogs.com/yeleia/p/6677274.html
Copyright © 2020-2023  润新知