创建型-单例(Singleton)

2020-09-14  本文已影响0人  DoneWillianm

单例(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

上一篇下一篇

猜你喜欢

热点阅读