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

    java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
      单例模式有一下特点:
      1、单例类只能有一个实例。
      2、单例类必须自己自己创建自己的唯一实例。
      3、单例类必须给所有其他对象提供这一实例。

    //饿汉式单例类.在类初始化时,已经自行实例化 
     public class Singleton1 {
         //私有的默认构造子
         private Singleton1() {}
         //static 修饰  类初始化时创建唯一实例 
         private static final Singleton1 single = new Singleton1();
         //静态工厂方法 
         public static Singleton1 getInstance() {
             return single;
         }
     }
    
    //懒汉式单例类.在第一次调用的时候实例化 
     public class Singleton2 {
         //私有的默认构造子
         private Singleton2() {}
         //注意,这里没有final    
         private static Singleton2 single=null;
         //静态工厂方法 
         public synchronized  static Singleton2 getInstance() {
              if (single == null) {  
                  single = new Singleton2();
              }  
             return single;
         }
     }
    
    import java.util.HashMap;
    import java.util.Map;
    
    //登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的
    //类似Spring里面的方法,将类名注册,下次从里面直接获取。
    
    public class RegSingleton {
        private static Map<String, RegSingleton> map = new HashMap<String, RegSingleton>();
    
        static {
            RegSingleton single = new RegSingleton();
            map.put(single.getClass().getName(), single);
        }
    
        //默认构造 保护
        protected RegSingleton() {
        }
    
        //静态工厂方法,返还此类惟一的实例
        public static RegSingleton getInstance(String name) {
            if (name == null) {
                name = RegSingleton.class.getName();
            }
            if (map.get(name) == null) {
                try {
                    map.put(name, (RegSingleton) Class.forName(name).newInstance());
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
            return map.get(name);
        }
    
        public String about() {
            return "Hello, I am RegSingleton.";
        }
    
        public static void main(String[] args) {
            RegSingleton single = RegSingleton.getInstance(null);
            System.out.println(single.about());
            System.out.println(RegSingletonChild.getInstance().about());
        }
    
    }
    
    public class RegSingletonChild extends RegSingleton {
    
        public RegSingletonChild() {
        }
    
        /**
         * 静态工厂方法
         */
        static public RegSingletonChild getInstance() {
            return (RegSingletonChild)RegSingleton.getInstance(RegSingletonChild.class.getName());
        }
    
        public String about() {
            return "Hello, I am RegSingletonChild.";
        }
    
    }
    
  • 相关阅读:
    纯css3实现的超炫checkbox复选框和radio单选框
    css3和jquery实现的可折叠导航菜单(适合手机网页)
    HTML5 Canvas 梦幻的文字飞扬动画教程
    纯css3实现的圆形旋转分享按钮
    纯css3实现的创意图片放大镜
    java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
    python的range函数与切片操作符
    python简单基础代码
    android笔记 : Content provider内容提供器
    android笔记:Service
  • 原文地址:https://www.cnblogs.com/iiot/p/4414093.html
Copyright © 2011-2022 走看看