zoukankan      html  css  js  c++  java
  • 设计模式之单例模式

    单例模式  Singleton

    参考:https://www.cnblogs.com/zuoxiaolong/p/pattern2.html    侵权删除

    什么是单例模式:保证在程序运行周期,至多有一个该对象。

    适用性:对象多次重复实例化的场景

    单例模式分类:饿汉式、懒汉式、静态内部类

    代码要点:

    私有化构造函数:保证外部不能实例化对象

    私有静态对象:不公开只能通过公开静态获取对象的方法获取对象、公开静态获取对象的方法是静态所以静态

    公开静态获取对象的方法:在没有实例的情况下,对开提供获取对象方法。

    基本代码如下:

    package EagerSingleton;
    /**
     * 饿汉模式:类的初始化阶段就实例化对象,如果未使用到该对象,会造成资源的浪费,不存在线程安全问题。
     *
     */
    public class EagerSingleton {
        //上来就实例化对象,如果未使用到该对象,会造成资源的浪费
        private static EagerSingleton instance = new EagerSingleton();
        private EagerSingleton(){}
        public static EagerSingleton getInstance(){
            return instance;
        }
    }
    package LazySingleton;
    
    /**
     * 懒汉模式
     * 只有当第一次需要使用该类的对象时,才创造类,比较的懒
     * 为了保证在多线程的情况下只能创建一个实例,可以使用双检查锁,单检查锁(下面的代码没有实现)
     * 单检查锁:保证一个实例,但是性能不高,许多线程处于阻塞状态。
     * 双检查锁:由于JVM的reorderu优化的原因,可能其他线程会返回一个null的实例
     */
    public class LazySingleton {
        private static LazySingleton instance;
        private LazySingleton() {
        }
        public static LazySingleton getInstance(){
    
            if(instance==null){
                //instance = new LazySingleton();
                synchronized (LazySingleton.class){
                    if(instance==null){
                        instance = new LazySingleton();
                    }
                }
            }
            return instance;
        }
    }
    package InnerSingleton;
    
    /**
     * 静态内部类的方法
     * 静态内部类中保存单例,当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化,instance得到实例化。
     * 因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性
     */
    public class InnerSingleton {
        private InnerSingleton(){}
        //当客户端调用静态方法getInstance()时,会导致InnerSingleton的初始化,再导致静态成员SingletonHolder的初始化
        private static class SingletonHolder{
            // instance得到实例化。
            private static InnerSingleton instance = new InnerSingleton();
        }
    
        public static InnerSingleton getInstance(){
            return SingletonHolder.instance;
        }
    }
  • 相关阅读:
    iOS开发UI篇—字典转模型
    使用python编写批量卸载android应用的脚本
    CircularProgressBar
    Custom-Progress-Dialog-Android
    picasso jar
    swift
    Python编程
    H264分析工具
    Android Websites
    AnATools
  • 原文地址:https://www.cnblogs.com/youzoulalala/p/11063445.html
Copyright © 2011-2022 走看看