打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
设计模式之单例模式

单例模式

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

确保一个类中只有一个实例 那么他的构造函数需要时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() {
    }
}






本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java设计模式-之Singleton单例模式 - 设计模式
单例模式
java几种方式实现单例设计模式
怎样实现线程安全的延迟初始化单例模式 ??
Java单例模式深入详解
单例模式的七种写法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服