文档章节

小博老师解析Java核心技术 ——单例模式的运用

博为峰教研组
 博为峰教研组
发布于 2016/12/09 14:50
字数 785
阅读 8
收藏 0
点赞 0
评论 0

[引言]

我们在学习软件开发面向对象编程思想的时候,要深入理解面向对象的设计思想,就会接触到一些设计模式。其中单例模式就是一个使用和面试频度相当高的设计模式。今天小博老师就为大家讲解单例模式的运用案例。

 

[步骤阅读一]单例模式的作用

我们首先来制作一个简单的Java窗体程序,程序启动后实例化登录窗体,在登录窗体中点击“注册”按钮后,会弹出注册窗体。登录窗体核心代码如下:

package com.bwf.technology.javase.jswing;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPasswordField;

import javax.swing.JTextField;

public class BWFLogin extends JFrame{

public BWFLogin(){

super("www.51code.com");

setBounds(200, 100, 320, 245);

setLayout(null);

logo = new JLabel(new ImageIcon("files/bwf_logo.png"));

logo.setBounds(10, 10, 281, 75);

this.add(logo);

lb1 = new JLabel("账户名称:");

lb1.setBounds(5, 100, 80, 25);

this.add(lb1);

txtUsername = new JTextField();

txtUsername.setBounds(80, 100, 200, 25);

this.add(txtUsername);

lb2 = new JLabel("账户密码:");

lb2.setBounds(5, 130, 80, 25);

this.add(lb2);

txtPassword = new JPasswordField();

txtPassword.setBounds(80, 130, 200, 25);

this.add(txtPassword);

btLogin = new JButton("登  录");

btLogin.setBounds(100, 160, 80, 25);

this.add(btLogin);

btRegist = new JButton("注  册");

btRegist.setBounds(200, 160, 80, 25);

this.add(btRegist);

btRegist.addMouseListener(new MouseListener() {

public void mouseReleased(MouseEvent e) {}

public void mousePressed(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseClicked(MouseEvent e) {

new BWFRegist();

}

});

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public JLabel logo;

public JLabel lb1;

public JLabel lb2;

public JTextField txtUsername;

public JPasswordField txtPassword;

public JButton btLogin;

public JButton btRegist;

}

 

注册窗体的核心代码如下:

package com.bwf.technology.javase.jswing;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class BWFRegist extends JFrame{

public BWFRegist(){

super("欢迎加入博为峰培训");

setBounds(300, 150, 300, 300);

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

}

}

 

如果我们只是这样编程程序的话,当用户多次点击注册按钮,就会出现多个注册窗体:

我们希望只能有一个注册窗体同一时间存在,当用户点击登录窗体中的“注册”按钮后,如果此时没有注册窗体,那就实例化一个注册窗体,而如果此时已经存在了注册窗体,就返回已经存在的注册窗体实例。

这个时候,我们就需要将注册窗体类设计成单例模式类了,单例模式的作用就是控制一个类同一时间只能存在一个实例。

 

[步骤阅读二]单例模式实现

现在我们修改注册窗体为单例设计模式,核心代码如下:

package com.bwf.technology.javase.jswing;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class BWFRegist extends JFrame{

private static BWFRegist instance;

private static String key = "welcome to bwf";

public static BWFRegist getInstance(){

ifinstance == null){

synchronized (key) {

ifinstance == null ){

instance = new BWFRegist();

}

}

}

return instance;

}

private BWFRegist(){

super("欢迎加入博为峰培训");

setBounds(300, 150, 300, 300);

this.addWindowListener(new WindowListener() {

public void windowOpened(WindowEvent e) {}

public void windowIconified(WindowEvent e) {}

public void windowDeiconified(WindowEvent e) {}

public void windowDeactivated(WindowEvent e) {}

public void windowClosing(WindowEvent e) {

ifinstance != null ){

synchronized (key) {

ifinstance != null ){

instance.dispose();

instance = null;

}

}

}

}

public void windowClosed(WindowEvent e) {}

public void windowActivated(WindowEvent e) {}

});

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

}

}

然后对于登录窗体中“注册”按钮的点击事件稍作修改,把获得注册窗体实例的代码修改为:

// new BWFRegist();

BWFRegist.getInstance();

 

这样一来,我们就实现了同一时间,只会有一个注册窗体存在啦。

© 著作权归作者所有

共有 人打赏支持
博为峰教研组
粉丝 49
博文 1224
码字总数 479077
作品 0
黄浦
程序员
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

java开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548 ⋅ 05/28 ⋅ 0

Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei ⋅ 05/26 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

⋅ 06/10 ⋅ 0

2018年Java编程学习面试最全知识点总结

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/14 ⋅ 0

Java 设计模式 之 单例模式 Singleton 实际应用

Java 设计模式 之 单例模式 Singleton 实际应用 http://www.verejava.com/?id=16998954233354

verejava ⋅ 05/24 ⋅ 0

Java篇-接口interface关键字

一 : interface关键字 接口是与类并行的一个概念 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,...

TianTianBaby223 ⋅ 04/24 ⋅ 0

详解Proxy代理模式的场景分析

代理模式是一个十分优秀的软件架构模式,许多应用都用到了代理模式。代理模式就是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不合适或者不能直接引用另一个对象,...

Java架构 ⋅ 05/30 ⋅ 0

【唯品会】设计模式在特卖会的应用与思考

设计模式在特卖会的应用与思考 无心之心,道之所存 --《建筑的永恒之道》 1、开篇 之所以讨论设计模式,是因为当前我们都明白它可以提供优雅的解决方案,有利于在团队项目中建立共识,并且无...

暗夜在火星 ⋅ 2016/11/12 ⋅ 0

spring源码解析系列之事件驱动模型架构

说在前面 为什么要去研究spring源码,我认为java最NX的就是我写接口你来实现,像oracle,要么就是想spring这样框架,什么框架我都可以整合你,这么NX的框架你没有想研究下源码的冲动吗。O(∩...

天河2018 ⋅ 04/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部