zoukankan      html  css  js  c++  java
  • java中的单例模式

    单例模式是一种设计模式,这一种设计模式的目的是使得该类在整个JVM系统中只有唯一的一个实例对象,在就java开发过程中,很多场景下会碰到这种需求,所以单例模式也是最常用的设计模式之一,下面从以下几个方面对单例模式进行解说。

    一、单例模式的概念:

           需要设计一个类,达到的效果:在类的整个应用中指存在一个对象,如果把这个类当做是数据类型,把对象当做该类的一个具体的值时,也就意味着这个数据类型只有一个值

    二、单例模式的特点

       ①这个类有且只有一个实例

       ②这个类必须自己创建这个实例对象

       ③这个类必须向外部提供它的这一个实例对象。

    三、单例模式的设计思路:

    构造器私有化     静态字段指向该类实例     静态方法返回该类实例

       ①构造器私有化,这样外部就不能通过该类的构造方法创建该类对象

       ②静态字段指向该类实例,同时要将这个字段私有化,这样外部就不能随意修改这个字段值,设置为静态外部才能通过该类类名可以取到这个对象

       ③静态方法返回该类实例,一般在方法命名为getInstance(),这个方法是供外部使用的,所以要设置成public修饰的,同样需要设置成static类级别的,因为要让外部通过类名调用该方法

    四、单例模式的几种实现方式:

    (1)饿汉模式

    在类加载的时候就创建好那个实例对象,不管需不需要那个实例对象都会创建对象,导致加载的时候会比较慢

    代码如下:

    //饿汉模式
    class Singleton{
        //1.构造方法私有化
        private Singleton(){
        }
        //2.提供一个该类实例的字段并且私有化该字段,
        private static Singleton instance = new Singleton();
        //3.提供一个静态方法供外部使用获取到该类实例
        public static Singleton getInstance(){
            return instance;
        }
    }

    (2)静态代码块

    在饿汉模式的基础上的加强,通过静态代码块来初始化实例对象,这个实例对象也是在类加载的时候创建的

    代码如下:

    //静态代码块
    class Singleton{
        //1.构造方法私有化
        private Singleton(){
        }
        //2.提供一个该类实例的字段并且私有化该字段,
        private static Singleton instance;
        //3.通过静态代码块初始化字段值
        static{
            instance = new Singleton();
        }
        //4.提供一个静态方法供外部使用获取到该类实例
        public static Singleton getInstance(){
            return instance;
        }
    }

    (3)懒汉模式

    在需要使用到这个实例对象的时候再去创建这个对象,但可能引起线程安全问题,同步synchronized同步代码块解决线程安全问题

    代码如下:

    class Singleton{
        //1.构造方法私有化
        private Singleton(){
        }
        //2.提供一个该类实例的字段并且私有化该字段,
        private static Singleton instance;
        //3.提供一个静态方法供外部使用获取到该类实例
        public static Singleton getInstance(){
            synchronized (Singleton.class) {
                if(instance == null)
                    instance = new Singleton();
            }
            return instance;
        }
    }

    (4)枚举【推荐使用】

    枚举:枚举是一个类型只有固定的几个值,当我们将枚举的值设置成一个,那就是单例模式

    public class Test{
        //使用枚举,直接使用类名
        Singleton instance = Singleton.INSTANCE;
    }
    enum Singleton {
        INSTANCE;
    }
  • 相关阅读:
    HDU.2087 剪花布条
    一个acm过来人的心得
    一个acm过来人的心得
    HDU.2190 悼念512汶川大地震遇难同胞——重建希望小学
    HDOJ.2501 Tiling_easy version
    HDOJ.2501 Tiling_easy version
    HDU
    poj3216 Prime Path(BFS)
    poj1426 Find The Multiple (DFS)
    Rikka with Nickname (简单题)
  • 原文地址:https://www.cnblogs.com/qiaoqiaoli/p/10805953.html
Copyright © 2011-2022 走看看