努力保头发的打工人
努力保头发的打工人
发布于 2020-12-12 / 14 阅读 / 0 评论 / 0 点赞

单例模式

1.概述

1.1定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

1.2 优缺点

优点:减少内存开销,避免了对资源的多重占用;

缺点:扩展困难,扩展只能修改代码;

1.3 使用场景

  • 要求生成唯一序列号的环境;

  • 整个项目需要一个共享访问点或共享数据;

  • 创建一个对象需要消耗资源过多;

  • 需要定义大量的静态常量和静态方法的环境,可以采用单例(也可直接使用static声明)

2 代码实例

/**
 * @author chiangtaol
 * @date 2020-11-17
 * @describe 单例模式测试类
 */
public class IronMan {
    private static Object lock = new Object();
    private static volatile IronMan ironMan = null;
​
    private IronMan() {
        // 我心中只有一个钢铁侠
    }
​
    // 对外提供获取实例方法
    public static IronMan getIronMan() {
        if (null == ironMan) {
            synchronized (lock) {
                if (null == ironMan) {
                    ironMan = new IronMan();
                }
            }
        }
        return ironMan;
    }
}

单例模式可以简单拓展,比如规定某个对象有固定个数的实例。

/**
 * @author chiangtaol
 * @date 2020-11-17
 * @describe 固定数量实例测试类
 */
public class Captain {
​
    private static final int captainNumber = 2;
    private static final String principalName = "正队长";
    private static final String assistantName = "副队长";
    private static List<Captain> list = new ArrayList<>();
​
    private String name;
​
    private Captain(String name){
        // 队长可以有两个,一个正,一个副
        this.name = name;
    }
​
    static {
        list.add(new Captain(principalName));
        list.add(new Captain(assistantName));
    }
​
    public static Captain getCaption(){
        Random random = new Random();
        return list.get(random.nextInt(captainNumber));
    }
​
    public void say(){
        System.out.println(name+"在此");
    }
}