设计

Java设计模式:单例模式

设计思维应用于数据解决方案

Java设计模式

设计模式是我们在软件开发过程中所面临的常见问题的一种描述良好的解决方案。这些解决方案是通过许多软件专业人员在相当长的一段时间内的经验获得的。因此,这些模式是“进化”而不是“发现”的。学习这些模式可以帮助即将到来的开发人员以一种简单而快速的方式学习软件设计

1994年,四位作者:Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides出版了一本名为《设计模式——可重用面向对象软件的元素》的书,这本书在软件开发中提出了设计模式的概念。这些作者被统称为“四人帮”(GOF)。这种设计模式的简称为GOF设计模式。根据这些作者的观点,设计模式主要基于以下面向对象设计原则。

•程序到接口,而不是实施
•更喜欢对象组合而不是继承

设计模式类型:

有23种设计模式,可以分为三类:创造模式、结构模式和行为模式。
在这里,我们还将讨论另一种类型的设计模式,称为杂项/ J2EE /呈现层图案。这些模式由Sun Java Center识别。

1.创建型设计模式
处理创建逻辑的同时创建对象的设计模式,而不是直接使用新操作员实例化对象。这使得该程序在确定需要为给定用例创建哪些对象时更具灵活性。

1.1单身图案
单例模式是Java中最简单的设计模式之一。

我们能回忆起什么是单例类吗?

在面向对象的编程中,单例类是一个可以有一次只能有一个对象(类的一个实例)。“
单身模式的目的是控制对象创建,将对象的数量限制为仅一个。
现在您知道了什么是单例设计模式。下一步将是实现它。

要在Java编程语言中实现Singleton设计模式,开发人员需要具备以下条件:
静态会员:它将在JVM内存中创建单个实例,因为静态是类级变量。
私人构造函数:它将从外部限制Singleton类的实例化(即防止使用new关键字初始化这个类)
静态工厂方法:这提供了对Singleton对象的全局访问点,并将实例返回给呼叫者

下面的流程图为您提供了单身设计模式的清晰图片

单例模式的图像

Singleton的初始化类型:

单例班可以实例化两个方法:

1.早期的初始化:在此方法中,该类初始化是否要使用。这种方法的主要优点是其简单性。您在课堂加载时发起课程。缺点是类始终初始化是否使用它。
2.延迟初始化:在此方法中,仅当需要时才初始化类。当您不需要时,它可以保存到实例化课程。通常,当我们创建单例类时,使用延迟初始化。

早期的初始化:

包com.creationaldesign.singleton;
public class SingletonClass {
/ **早期初始化* /
//创建单例Class的对象
/ /静态属性
私有静态单例intant = new singletonclass();
//将构造函数设置为private,这样类就不能为
/ /实例化
//注意:单例模式限制类的实例化,并确保
// Java虚拟机中只存在类的一个实例
//私有构造函数
私人单身母增(){

//获得唯一可用的对象
//静态功能
公共静态单例格子getInstance(){
返回实例;

public void showMessage() {
system.out.println(“这是来自Singleton类的消息”);

这里我们已经在静态初始化器中创建了Singleton的实例。JVM在装入类时执行静态初始化器。只有当你的单例类很轻并且在整个程序的执行过程中使用时,才使用这个方法。

你也可以采取更好的方法“双重检查锁定
“双重检查锁定”:
如果你注意到,一旦创建了一个对象,同步就不再有用了,因为现在obj将不再为空,任何操作序列都将导致一致的结果。

因此,当obj为null时,我们只会获取getInstance()上的锁。这样我们就只同步了第一种方法,这正是我们想要的,因此这保证了线程安全。

延迟初始化:

包com.creationaldesign.singleton;
/ **
*基于双重检查锁定的Java实现的单例设计模式
这在https://en.wikipedia.org/wiki/Singleton_pattern中有明确提到
*在惰性初始化下
*/
public class SingletonClass {
//静态和Volatile属性
private volatile static SingletonClass obj;
//私有构造函数
私人单身母增(){

//静态功能
公共静态单例格子getInstance(){
if(obj == null){
//提供线程安全实现
同步(SingletonClass.class){
//再次检查,因为多个线程可以达到以上步骤
obj == null
obj = new SingletonClass();


返回obj;

我们已经声明了obj volatile,以确保当obj被初始化为Singleton实例时,多个线程能够正确地提供obj变量。这个方法大大减少了每次调用同步方法的开销。

在两个中的任何一个(早期/延迟初始化)方法创建一个类。然后创建main方法来测试Singleton类,如下所示:

主要方法:

包com.creationaldesign.singleton;
/ **
*单例模式主类!

*/
public class SingletonPatternApp {
public static void main(String[] args) {
// ingleton类的非法构造
//编译时错误:构造函数SingleObject()是不可见的
//单身奏分子newobjinstance = new singletonclass();
//获得唯一可用的对象
SingletonClass getOldInstance = SingletonClass. getinstance ();
//显示信息
getOldInstance.showMessage ();

控制台输出:
这是Singleton类的消息

类图:

单例模式类图

让我们看一些例子单例类:

1)java.lang.runtime:Java在其Lang封装中提供了一个类运行时,它是单身的自然界。
2)java.awt.Desktop:Desktop类允许Java应用程序启动在本机桌面注册的相关应用程序来处理URI或文件。这个类也不能从应用程序实例化。因此它也是一个Singleton类。
3)高速缓冲存储器
4)数据库连接
5)司机
6)伐木
7)硬件访问
8)配置文件

发表评论

这个网站使用Akismet来减少垃圾邮件。了解如何处理评论数据

订阅每周博客文摘:

报名
类别