• java 单例模式


     

    单列设计模式:
    所谓的单列设计模式,就是采取一定的方法,保证整数软件系统中,只能存在一个对象实例。

     

    特点:

    1. 单例类只能有一个实例

    2.单例列必须自己创建自己的唯一实例

    3.单例类必须给所有其他对象提供这一实例

     

     

     

    饿汉式单例模式

    1. // 如何实现?:
    2. public static void main(String[] args) {
    3. // 返回的就是bank1 对象 (返回两个唯一的对象)
    4. Bank bank1 = Bank.getInstance();
    5. Bank bank2 = Bank.getInstance();
    6. System.out.println(bank1 == bank2); // 返回true(地址值是一样的);
    7. // Bank instance = Bank.getInstance();
    8. }
    9. }
    10. // 银行类: 单例 (饿汉式单例模式)
    11. class Bank {
    12. // 1. 私有化类 的构造器,为了避免,除Bank类的外面调用构造器,(即实例化对象)
    13. private Bank(){
    14. }
    15. // 2.内部 创建类的对象 (外面除了,Bank类以外实例化不了对象,只能在内部)
    16. // 要求此对象,也必须声明为静态的
    17. private static Bank instance = new Bank(); // (静态的)
    18. // 3,提供公共的静态方法,返回类的对象,静态的方法中只能调用静态的结构
    19. // 如果这里不是静态方法,是一般方法,外部类中的得创建Bank类的实例化对象,这样就可以调用getInstance方法,返回一个对象
    20. public static Bank getInstance(){ //(静态的)
    21. return instance;
    22. }
    23. }

     

     

     

    懒汉式单例模式:

     

    1. public class SingletonTest2 {
    2. public static void main(String[] args) {
    3. //类名(要实例化的是哪个对象) 变量名(用来接收实例化对象)
    4. Order order1 = Order.getInstance();
    5. Order order2 = Order.getInstance();
    6. System.out.println(order1 == order2);// true
    7. }
    8. }
    9. class Order {
    10. //1.私有化类的构造器
    11. private Order(){
    12. }
    13. // 2. 先声明当前类的对象,没有初始化
    14. // 4. 此对象也必须声明为static的
    15. private static Order instance = null;
    16. // 3. 声明public、static的返回当前类对象的方法
    17. public static Order getInstance(){
    18. // 错误写法:
    19. // instance = new Order();
    20. // return instance;
    21. // 不加if 判断,每调用一下getInstance,就创建一个新的Order实例化对象
    22. if(instance == null){ // 如果没有实例化对象,就创建
    23. instance = new Order();
    24. }
    25. return instance;
    26. }
    27. }

     

    【区分】

    饿汉式:

     坏处:  对象加载时间过长

    好处: 线程安全的(不会存在多个线程抢一个资源之类的)

               

     

     

    懒汉式:   好处: 延迟对象创建

                 坏处:  不安全

    例子:  两个线程都去获取这个对象,首次调用为null(判断),线程就假设阻塞了一下 ,就在这个阻塞的时间之内,另外一个线程也去获取这个对象,此时判断还是null,等阻塞没有了,他们两个对象  就进入if里面的new,各自实例化了一个实例对象,这样不安全,比如出现多个人抢到了一张火车票。

     

     

    【应用场景】

     

    网页的计数器,应用程序的日志应用,数据库的连接池,项目中读取配置文件的类,

    任务管理器,回收站也是。

  • 相关阅读:
    【python】通过gitlab v4版本api接口获取所有项目代码示例
    多维数据驱动的粮食安全分析与智能决策系统研究与实践
    SSM出租车查询系统 毕业设计-附源码220915
    GitHub-Issue 正确的提问方式
    计算机毕业设计ssm社会救援力量信息管理统计系统6q3cn系统+程序+源码+lw+远程部署
    【LeetCode每日一题:1779. 找到最近的有相同 X 或 Y 坐标的点~~~模拟遍历+曼哈顿距离】
    MySQL Create table as select无法执行
    juc详解
    SYN Flood实验以及利用gns3进行攻击过程分析
    SLAM从入门到精通(camera数据读取)
  • 原文地址:https://blog.csdn.net/qq_54250695/article/details/125867583