分享

设计模式之单例模式

 东西VS南北 2017-11-16

单例模式

定义 (确保一个类只有一个实例 而且自行实例化并向整个系统提供这个实例)

确保一个类中只有一个实例 那么他的构造函数需要时private权限的 并且是在自己的类中自行实例化 (自己new出来的 )

uml类图

 

  单例模式的要点有三个;

  一是某个类只能有一个实例;

  二是它必须自行创建这个实例;

  三是它必须自行向整个系统提供这个实例。

单例模式的优点

1 由于单例模式在整个项目运行中只有一个实例 这样就减少了内存的占用 当一个对象需要频繁的创建 销毁时 创建和销毁的过程又没有办法优化 这个时候单例模式的优势非常明显

2 减少了性能的开销 当一个对像的创建需要 比较多的资源 比如读取配置 产生其他的依赖对象的时候 都可以在系统启动的时候创建一个单例对象 在内存中保存

3 避免对资源的多重占用 单例只有一个对象 比如文件资源的读写操作 由于只有一个对像 避免了对一个文件的同时操作

4 可以设置全局访问 共享资源访问 比如登录的用户

单例模式的缺点

   不利于扩展 单例模式没有接口 扩展很难 有需求的变更的时候只能修改代码

代码示例 单列模式

/**

 * 第一种(懒汉,线程不安全)

 */

public class WangTeacher {

    private static WangTeacher instance;


    private WangTeacher () {}


    public static WangTeacher getInstance() {

        if (instance == null) {

            instance = new WangTeacher();

        }

        return instance;

    }


    public static void say() {

        System.out.println("我是王老师");

    }

}

 /**

 * 第二种(懒汉,线程安全,但是很消耗性能)

 */

public class QiTeacher {

    private static QiTeacher instance;


    private  QiTeacher () {}

    public static synchronized  QiTeacher getInstance() {

        if (instance == null) {

            instance = new QiTeacher();

        }

        return instance;

    }


    public static void say() {

        System.out.println("我是齐老师");

    }

}

/**.
 * 第三种(饿汉)
 */
public class QiaoTeacher {

    private static QiaoTeacher instance = new QiaoTeacher();
    private QiaoTeacher (){}
    public static QiaoTeacher getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("我是乔老师");
    }
}
/**
 * 第四种(饿汉 变种)
 */
public class LiTeacher {
        private static LiTeacher instance = null;
        static {
            instance = new LiTeacher();
        }
        private LiTeacher (){}
        public static LiTeacher getInstance() {
            return instance;
        }
}

/**

 * 第五种(静态内部类)

 */

public class SunTeacher {

        private static class SingletonHolder {

            private static final SunTeacher INSTANCE = new SunTeacher();

        }

        private SunTeacher (){}

        public static final SunTeacher getInstance() {

            return SingletonHolder.INSTANCE;

        }

}

/**

 * 双重锁

 */

public class ZhangTeacher {

    private volatile static ZhangTeacher singleton;

    private ZhangTeacher (){}

    public static ZhangTeacher getSingleton() {

        if (singleton == null) {

            synchronized (ZhangTeacher.class) {

                if (singleton == null) {

                    singleton = new ZhangTeacher();

                }

            }

        }

        return singleton;

    }

}

/**
 * 枚举
 */
public enum ZhouTeacher {

    INSTANCE;
    public void whateverMethod() {
    }
}






    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多