侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 92 篇文章
  • 累计创建 109 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

单例模式

Epoch
2021-02-02 / 0 评论 / 0 点赞 / 251 阅读 / 648 字 / 正在检测是否收录...

单例模式

第一种创建形式

package com.xmaven.singleton;

/**
 * @ClassName SingletonOne
 * @Description TODO 单例模式 -- 饿汉模式 创建对象实例的时候直接初始化 空间换时间的形式
 * @Author Ambition
 * @Date 2021/1/12 15:17
 * @Version 1.0.0
 **/
public class SingletonOne {
    /**
     * 实现过程
     * 1. 只提供私有的构造方法
     * 2. 含有一个该类的私有对象
     * 3. 提供一个静态的公有引用与创建、获取静态私有对象
     */

    //1. 创建类中的私有构造
    private SingletonOne(){

    }

    //2. 创建该类型的私有静态实例
    private static SingletonOne instance = new SingletonOne();

    //3. 创建公有静态方法返回静态实例对象
    public static SingletonOne getInstance(){
        return instance;
    }

}

测试:

package com.xmaven.test;

import com.xmaven.singleton.SingletonOne;

/**
 * @ClassName MainOne
 * @Description TODO 单例模式--饿汉式测试
 * @Author Ambition
 * @Date 2021/1/12 15:22
 * @Version 1.0.0
 **/
public class MainOne {

    public static void main(String[] args) {
        SingletonOne one = SingletonOne.getInstance();
        SingletonOne two = SingletonOne.getInstance();
        System.out.println(one);
        System.out.println(two);
        // 他们引用的都是一个地址
    }

}

第二种创建形式

package com.xmaven.singleton;

/**
 * @ClassName SingletonTwo
 * @Description TODO 单例模式--懒汉式 类内实例对象创建时并直接初始化,知道第一次调用get方法时,才完成初始化操作  时间换空间
 * @Warning  懒汉式存在进程风险
 * @Deal  解决方法 1. 同步锁  2. 双重检验锁 3. 静态内部内 4. 枚举
 * @Author Ambition
 * @Date 2021/1/12 15:28
 * @Version 1.0.0
 **/
public class SingletonTwo {

    //1. 创建私有构造方法
    private SingletonTwo(){

    }

    //2. 创建静态的该类实例对象
    private static SingletonTwo instance = null;

    //3. 创建开放的静态方法提供实例对象
    public static SingletonTwo getInstance(){
        if (instance == null){
            instance = new SingletonTwo();
        }
        return instance;
    }

}

测试:

package com.xmaven.test;

import com.xmaven.singleton.SingletonTwo;

/**
 * @ClassName MainTwo
 * @Description TODO 单例模式 -- 懒汉式测试
 * @Author Ambition
 * @Date 2021/1/12 15:33
 * @Version 1.0.0
 **/
public class MainTwo {

    public static void main(String[] args) {
        SingletonTwo one = SingletonTwo.getInstance();
        SingletonTwo two = SingletonTwo.getInstance();
        System.out.println(one);
        System.out.println(two);
    }

}

单例模式

优点:

1.在内存中只有一个对象,节省内存空间

2.避免频繁的创建销毁对象,提高性能

3.避免对共享资源的多重占用


缺点:

1.拓展比较困难

2.如果实例化后的对象长期不利用,系统将会默认为垃圾进行回收,造成对象状态丢失


使用场景:

1. 创建对象资源时占用资源过多,但同时又需要用到该对象

2. 对系统内资源要求统一读写,如读写配置信息

3. 当多个实例存在可能引起程序逻辑错误,如号码生成器

0

评论区