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

    单例模式

    设计模式:java中一共有23种设计模式,设计模式就是有经验的前人通过实践总结下来被大家公认的代码设计思想。

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    注意
    1.单例类只能有一个实例
    2.单例类必须自己创建自己的唯一实例
    3.单例类必须给所有其他对象提供这一实例

    步骤:
    1.私有化构造器
    2.提供一个类方法获得实例

    package com.fzkj.Singleton;
    public class demo {
        public static void main(String[] args) {
    
            Singleton instance = Singleton.getInstance();
            Singleton instance1 = Singleton.getInstance();
            System.out.println(instance);
            System.out.println(instance1);
        }
    }
    
    class Singleton {
        // 创建一个Singleton实例
        private static Singleton singleton = new Singleton();
        // 提供一个类方法供外界获得实例
        public static Singleton getInstance(){
            return singleton;
        }
    }
    

    运行结果:

    com.fzkj.Singleton.Singleton@4554617c
    com.fzkj.Singleton.Singleton@4554617c
    

    事实上,单例模式的实现并不知上述一种方式,上面的实现方式称为'饿汉式'。还有一种创建方式称为'懒汉式'。

    懒汉式:

    class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
      
        public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }
    

    '饿汉式'和'懒汉式'最大的区别就在于实例创建的时间,从上述代码中可以发现,'饿汉式'的创建方式在类被加载的时候就会创建出实例。而'懒汉式'的创建方式则在方法被调用的时候才会创建出实例。
    上面的'懒汉式'的创建方式还存在着一个问题,那就是线程安全问题,显而易见,这种方式并不支持多线程。
    要想支持多线程,就得对其进行改造。

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }
    

    给方法加锁保证单例。
    而'饿汉式'的创建方式基于classloader机制避免了多线程的同步问题。就是在类加载的时候就已经完成了实例化,所以线程调用的时候就直接可以获得实例。

    先就介绍这两种方式。


    持续更新~~

  • 相关阅读:
    Jquery 取值,赋值学习总结
    JQuery 常用代码
    Spring Boot JPA
    QueryDSL通用查询框架学习目录
    正确理解MySQL中的where和having的区别
    spring jpa 带参数分页查询(一)
    mysql在表的某一位置增加一列、删除一列、修改列名
    Spring AOP注解配置demo
    java 分页对象以及数据库分页查询
    ztree点击加号+触发ajax请求
  • 原文地址:https://www.cnblogs.com/mrjkl/p/12719538.html
Copyright © 2011-2022 走看看