专栏首页Java知己Java设计模式:单例模式

Java设计模式:单例模式

Java知己

单例模式是Java中最常用的模式之一。它用于控制通过阻止外部实例化和修改而创建的对象数。这个概念可以推广到只有一个对象存在时更有效地运行的系统,或者将实例化限制为一定数量的对象,例如:

  1. 私有构造函数 - 没有其他类可以实例化新对象。
  2. 私有引用 - 无需外部修改。
  3. public static方法是唯一可以获取对象的地方。

单例的故事

这是一个简单的用例。一个国家只能有一位总统。因此,无论何时需要总统,都应该归还唯一的总统,而不是创建新总统。该getPresident()方法将确保始终只创建一个总统。

类图和代码

立即模式:

public class AmericaPresident {
	private static final AmericaPresident thePresident = new AmericaPresident();
 
	private AmericaPresident() {}
 
	public static AmericaPresident getPresident() {
		return thePresident;
	}
}

thePresident声明为final,因此它将始终包含相同的对象引用。

懒惰模式:

public class AmericaPresident {
	private static AmericaPresident thePresident;
 
	private AmericaPresident() {}
 
	public static AmericaPresident getPresident() {
		if (thePresident == null) {
			thePresident = new AmericaPresident();
		}
		return thePresident;
	}
}

正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。有需要的同学可以在公众号【Java知己】,发送【面试】领取最新面试资料攻略!

Java Stand Library 中使用的单例模式

java.lang.Runtime#getRuntime()是 Java 标准库中经常使用的方法。getRunTime()返回与当前 Java 应用程序关联的运行时对象。

class Runtime {
	private static Runtime currentRuntime = new Runtime();
 
	public static Runtime getRuntime() {
		return currentRuntime;
	}
 
	private Runtime() {}
 
	//... 
}

这是一个简单的使用示例getRunTime()。它读取 Windows 系统上的网页。

Process p = Runtime.getRuntime().exec("C:/windows/system32/ping.exe programcreek.com");

//get process input stream and put it to buffered reader
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
 
String line;
while ((line = input.readLine()) != null) {
	System.out.println(line);
}
 
input.close()

输出:

Pinging programcreek.com [198.71.49.96] with 32 bytes of data:
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47
Reply from 198.71.49.96: bytes=32 time=52ms TTL=47
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47

Ping statistics for 198.71.49.96:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 52ms, Maximum = 53ms, Average = 52ms

Singleton 模式的另一个实现

由于私有构造函数不能防止通过反射来实例化,Joshua Bloch(Effective Java)提出了更好的 Singleton 实现。如果你不熟悉 Enum,这里是Oracle关于 枚举 的一个很好的例子。

public enum AmericaPresident{
	INSTANCE;
 
	public static void doSomething(){
		//do something
	}
}

“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!

原文链接:https://www.programcreek.com/2011/07/java-design-pattern-singleton/

原文作者:programcreek

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 作为Java开发人员不会饿死的5个理由

    尽管已有20多年的历史,Java仍然是最广泛使用的编程语言之一。只需看看统计数据:根据2018年Stack Overflow开发人员调查,Java是世界上第三大...

    淡定的蜗牛
  • 每个 Java 开发人员都应该知道的 10 个基本工具

    大家好,我们已经在 2019 年的第 9 个月,我相信你们所有人已经在 2019 年学到了什么,以及如何实现这些目标。我一直在写一系列文章,为你提供一些关于你可...

    淡定的蜗牛
  • 避免Java应用程序中NullPointerException的技巧和最佳实践

    Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢。下面我们就从几个方面来入手,解决这个棘...

    淡定的蜗牛
  • 如何识别不同的编程语言(上)

    漫谈编程语言:数量 这又是一个有趣的话题~~,要知道编程语言有那么的多。引自Quora上一个相关问题的答案,从ABC到Z Shell就有256个。 但是这并不是...

    Phodal
  • 黑色产业二 怕被绿!竟然七成人都在借黑产定位追踪老婆

    生活中总是不乏这样的疑问和揣测,毕竟这是个浮躁的时代,在快节奏生活的高压下,「信任」越来越稀缺。

    用户1631416
  • Go 使用标准库 sql 包和三方数据库驱动包操作 MySQL

    在 Go 语言中,sql 包提供了数据库的通用接口,并且 sql 包必须与数据库驱动包一起使用,Go 标准库中没有数据库驱动包,需要使用第三方的数据库驱动包。需...

    frankphper
  • 23种设计模式之单例模式

    单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。

    用户2146693
  • 黑产白皮书 DDoS 篇——乌云笼罩下的产业百态

    知己知彼,百战不殆 ——《孙子·谋攻篇》 谋攻是《孙子兵法》的第三篇,主要讲的是 以智谋攻城,揭示“知己知彼,百战不殆”的规律。当你面对 DD...

    FB客服
  • 学编程的起点——高级语言大锅烩

    学知识前总想说点鸡汤,想喝的朋友就看看,不想喝的就直接看干货吧,就当鸡汤是给我自己喝的。

    泰斗贤若如
  • Android自定义View实现简单炫酷的球体进度球实例代码

    最近一直在研究自定义view,正好项目中有一个根据下载进度来实现球体进度的需求,所以自己写了个进度球,代码非常简单。先看下效果:

    砸漏

扫码关注云+社区

领取腾讯云代金券