zoukankan      html  css  js  c++  java
  • JAVA中的单例模式(采用单例模式定义的类)(转)

    1     单例(Singleton)模式:单例模式确保某一个类只有一个 实例,而且该类只能是自己 实例化自己并向其他类公开 这个实例的对象创建 模式

         采用单例模式的类:根据单例模式知道其要满足以下三点

         1. 确保某一个类只有一个实例

         2. 而且自己实例化

         3. 并向其他类提供这个实例类 。

    2    确保以上三点的所采用的编程策略
        * 把构造方法声明为Private。确保只能由自己创建,避免外部创建实例或者被子类继承从而创造额外实例;
        * 定义一个私有静态的该类的实例作为该类的数据域。确保一个类只能有一个实例;
        *定义一个静态 工厂方法。外部类不能实例化一个该类的对象,所以只能用Static 的方法,提供给其他类调用,返回此单例类唯一的实例。

    3、使用单例模式的条件:
         使用单例模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式,反过来说,如果一个类可以有几个实例共存,那么就没有必要使用单例模式类。

    4   单例在JAVA中的3种(一般形式)形式

    主动式单例类:

        public class ActiveSingleton {
           

    private static final ActiveSingleton m_instance = new ActiveSingleton ();
            // 在类加载的时候就实例化一个自己的对象
            private ActiveSingleton () {
            }
         //每次调用该工厂方法返回该实例
            public static ActiveSingleton getInstance() {
                return m_instance;
            }
        }

         java语言中单例类的一个最重要的特点是类的构造方法是私有的,从而避免外界利用构造子直接创建出任意多的实例。因为构造是私有的,因此此类不能被继承。主动式单例类在类加载的时候就实例化一个自己的对象。

    被动式单例类:

        public class LazySingleton {
            private static LazySingleton m_instance = null;
         
            private LazySingleton() {
            }
         //静态工厂方法, 在第一次被调用时才将自己实例化
            synchronized public static LazySingleton getInstance() {
                if (m_instance == null) {
                    m_instance = new LazySingleton();
                }
                return m_instance;
            }
        }

     与主动式单例类相同的是,被动式单例类的构造方法是私有的,不同的是在第一次被引用时才将自己实例化,如果加载器是静态的,那么在被动式单例类被加载时不会将自己实例化。  

    登记式单例类:
            登记式单例这个单例实际上维护的是一组单例类的实例(父类 和子类),将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从工厂直接返回,对于没有登记的,则先登记,而后返回。
        public class RegSingleton {
            private static HashMap m_registry = new HashMap();
         
            static {
                RegSingleton x = new RegSingleton();
                m_registry.put(x.getClass().getName(), x);
            }
         
        protected RegSingleton() {
            }
         
            public static RegSingleton getInstance(String name) {
                if (name == null) {
                    name = "RegSingleton";
                }
                if (m_registry.get(name) == null) {
                    try {
                        m_registry.put(name, Class.forName(name).newInstance());
                    } catch (Exception e) {
                        System.out.println("Error happened.");
                    }
                }
                return (RegSingleton) (m_registry.get(name));
            }
         
            // 一个测试方法
            public String about() {
                return "Hello, I am RegSingleton";
            }
        }
         
        // 登记式单例类的子类
        public class RegSingletonChild extends RegSingleton {
            public RegSingletonChild() {
            }
         
            // 静态工厂方法
            public static RegSingletonChild getInstance(){
                return (RegSingletonChild)RegSingleton.getInstance("RegSingleton")
            }
            public String about() {
                return "Hello, I am RegSingletonChild";
            }
        }

  • 相关阅读:
    iOS开发UI篇—Quartz2D使用(绘图路径)
    iOS开发UI篇—Quartz2D简单使用(三)
    iOS开发UI篇—Quartz2D使用(图片剪切)
    WordPress主题开发: 制作文章页面single.php
    Wordpress页面判断
    为WordPress某个文章添加额外的样式
    Wordpress本地伪静态设置
    Wordpress添加关键词和描述
    Wordpress制作sidebar.php
    Wordpress固定链接设置
  • 原文地址:https://www.cnblogs.com/kaikailele/p/3928240.html
Copyright © 2011-2022 走看看