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

    第一种:饿汉式

    public class Singleton {
        //饿汉式
        //在自己内部定义自己一个实例
        private static Singleton instance = new Singleton();
        
        //如上面所述。将构造函数设置为私有
        private Singleton(){
            
        }
        
        //静态工厂方法,提供了一个供外部访问得到对象的静态方法
        public static Singleton getInstance(){
            return instance;
        }
    }

    第二种:懒汉式(注意:多线程的情况下要用synchronized,线程同步)

    public class Singleton {
        //懒汉式
        private static Singleton instance = null;
        
        //如上面所述。将构造函数设置为私有
        private Singleton(){
            
        }
        
        //静态工厂方法,提供了一个供外部访问得到对象的静态方法
        public static synchronized Singleton getInstance(){
            if(instance == null)
                instance = new Singleton();
            return instance;
        }
    }

    第三种:静态内部类

    public class Singleton {
        
        private static class SingletonHolder{
            private static final Singleton INSTANCE = new Singleton();
        } 
        
        //构造函数私有化
        private Singleton(){}
        
        public static final Singleton getInstance(){
            return SingletonHolder.INSTANCE;
        } 
    }

    第四种:枚举

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

    第五种:双重校验锁

    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;
        }
    }

     第六种:登记式实现

    import java.util.HashMap;
    //父类
    public class Singleton {
        //用来存放对应关系
        private static HashMap<String,Singleton> sinRegistry = new HashMap<String,Singleton>();
        static private Singleton singleton = new Singleton();
        
        //受保护的构造函数
        protected Singleton(){
            
        }
        
        public static Singleton getInstance(String name){
            if(name == null){
                name = "Singleton";
            }
            if(sinRegistry.get(name) == null){
                try {
                    sinRegistry.put(name, (Singleton)Class.forName(name).newInstance());
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            return (Singleton)(sinRegistry.get(name));
        }
    }
    
    //子类
    public class SingletonChild extends Singleton{
        
        public SingletonChild(){}
        
        static public SingletonChild getInstance(){
            return (SingletonChild) Singleton.getInstance("SingletonChild");
        }
       
    }
  • 相关阅读:
    得到内网可用的SqlServer 及某数据库下的表及其他的架构
    VS2005 XML注释生成XML文档文件
    华表 单元格公式设定与计算
    自定义控件开发示例二
    自定义控件的 Enum类和Color类 属性的公开设定
    入门者初试 Cell(华表)结合C#的应用
    VS2005 + VSS6.0 简单应用示例
    SQL2000联机丛书:使用和维护数据仓库
    VS2005 通过SMO(SQL Management Objects) 管理 数据库的作业 警报 备份 等任务
    SQL2000联机丛书:基本 MDX
  • 原文地址:https://www.cnblogs.com/Venom/p/3282920.html
Copyright © 2011-2022 走看看