创建型-单例(Singleton)

单例(Singleton)

[TOC]

定义

顾名思义,单例模式其实就是在某种场景下有一类对象的职责会负责该场景下的一切,白话来说就是一个国家就一个皇帝,一个系统下就存在一个对象,该对象的生命周期贯穿整个系统下的开始到结束

简单场景使用

就譬如说您的英雄联盟账号,在您游戏的时候,只能有一个账号登录,并且您只能用这一个账号进行游戏,那么这个账号对于英雄联盟这款游戏而言,就是一个单例

coding

代码非常简单,其实仅仅一个类就能搞定,这里采用懒汉写法

public class Account {

    private volatile static Account instance;

    private String mStatus = "空闲";

    private Account() {
    }

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

    public String getUserName() {
        System.out.println("获取用户名 " + "用户账号:admin");
        return "用户账号:admin";
    }

    public List<String> getFriends() {
        List<String> friends = new ArrayList<>();
        friends.add("麻花藤");
        friends.add("王校长");
        friends.add("UZI");
        friends.add("草莓");
        System.out.println("获取好友列表: " + friends.get(0) + "," + friends.get(1) + "...");
        return friends;
    }

    public String getStatus() {
        return mStatus;
    }

    public void inGame() {
        setStatus("进入游戏");
    }

    public void exitGame() {
        setStatus("退出游戏");
    }

    public void matching() {
        setStatus("匹配中...");
    }

    private void setStatus(String status) {
        System.out.println("当前状态:" + status);
        mStatus = status;
    }

}

使用上的效果如下:

public static void main(String[] args) {
        //单例使用
        Account.getInstance().getUserName();
        Account.getInstance().getFriends();
        Account.getInstance().matching();
        Account.getInstance().inGame();
        Account.getInstance().exitGame();
    }

输出结果:

获取用户名 用户账号:admin
获取好友列表: 麻花藤,王校长...
当前状态:匹配中...
当前状态:进入游戏
当前状态:退出游戏

实际场景使用

在实际场景中的使用下,就会相对要复杂一些,譬如说某类型下的线程池设计,如简短生命周期不长的小线程可以设计为一种单例池,针对长期存活的子线程又可以设计为一种单例,某个组件或者业务场景下,设计一种跟随组件生命周期的单例对象

总结下来就是:

单例为某个程序或者某项场景下,唯一存在的特定属性的归纳实例或者作用实例。使用时需要注意内存泄露,因为单例的生命周期很长~同时在写法上保证线程安全。具体线程安全的例子如上写法即可保证,欢迎cv

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容