java 设计模式-对象创建型模式-单例模式

确保对象的唯一性——单例模式

网上看了很多关于设计模式的概念,感觉有点懵,怕又忘记了,记录一下。

链接:https://blog.csdn.net/lovelion/article/details/7420883
任何形式的转载都请联系作者获得授权并注明出处。

   单例模式(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类型的静态对象,作为外部共享的唯一实例。

单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值