确保对象的唯一性——单例模式
网上看了很多关于设计模式的概念,感觉有点懵,怕又忘记了,记录一下。
任何形式的转载都请联系作者获得授权并注明出处。
单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。举个大家都熟知的例子:
——Windows任务管理器,在Windows的“任务栏”的右键弹出菜单上多次点击“启动任务管理器”,看能否打开多个任务管理器窗口?通常情况下,无论我们启动任务管理多少次,Windows系统始终只能弹出一个任务管理器窗口,也就是说在一个Windows系统中,任务管理器存在唯一性。为什么要这样设计呢?我们可以从以下两个方面来分析:
其一,如果能弹出多个窗口,且这些窗口的内容完全一致,全部是重复对象,这势必会浪费系统资源,任务管理器需要获取系统运行时的诸多信息,这些信息的获取需要消耗一定的系统资源,包括CPU资源及内存资源等,浪费是可耻的,而且根本没有必要显示多个内容完全相同的窗口;
其二,如果弹出的多个窗口内容不一致,问题就更加严重了,这意味着在某一瞬间系统资源使用情况和进程、服务等信息存在多个状态,例如任务管理器窗口A显示“CPU使用率”为10%,窗口B显示“CPU使用率”为15%,到底哪个才是真实的呢?这纯属“调戏”用户,,给用户带来误解,更不可取。由此可见,确保Windows任务管理器在系统中有且仅有一个非常重要。
package com.zt.demo.design;
/**
* ClassName: Singleton
* @Description: 单例模式
* @author chenlijun
* @date 2019年3月6日
*/
public class Singleton{
public static void main(String[] args) {
single s= single.getInstance();
single s1= single.getInstance();
System.out.println("两次getInstance 只实例化了一次:\r"+"S\t"+s+"\rs1\t"+s1);
}
}
class single {
//1.为了确保single唯一性,禁止外部类直接调用函数。需要将single构造函数可见性设置为private
private single(){}
//2.为了在内部创建实例,让外界可以访问这个唯一实例,需要在single中定义一个静态的single类型的私有成员变量
private static single s= null;
//3.为了保证成员变量的封装性,我们将single类型的s对象的可见性设置为private,增加一个公有的静态方法让外界可以访问
public static single getInstance(){
if(null == s){
s = new single();
}
return s;
}
//4.实例中的函数
public void getCpu(){
System.out.println("获取CPU");
//.....
}
public void getTask(){
System.out.println("获取Task");
//.....
}
}
运行结果
两次getInstance 只实例化了一次:
S com.zt.demo.design.single@15db9742
s1 com.zt.demo.design.single@15db9742
在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个single类型的静态对象,作为外部共享的唯一实例。
单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。