文档章节

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

博为峰教研组
 博为峰教研组
发布于 2016/12/09 14:50
字数 785
阅读 8
收藏 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();

 

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

© 著作权归作者所有

共有 人打赏支持
博为峰教研组
粉丝 50
博文 1224
码字总数 479077
作品 0
黄浦
程序员
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52717096 JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模...

Aduroidpc
2016/10/01
0
0
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

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

法斗斗
05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx开启stub_status模块配置方法

nginx开启stub_status模块配置方法 2017年12月13日 15:57:29 ly_dengle 阅读数:3765 标签: stub_statusnginxnginx开启stub_status模块 更多 个人分类: 软件工具php 版权声明:本文为博主原...

linjin200
32分钟前
3
0
挑逗 Java 程序员的那些 Scala 绝技

有个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言;而另外一些 Java 开发者却对它望而却步,认为它过于复杂而难以理解。同样是 ...

joymufeng
35分钟前
94
0
精通Spring Boot——第十三篇:整合Mybatis多数据源

久违了,最近度过了一段倦怠期,这段时间干什么都没有动力,拖延症复发。好在我回来了.... ——From me . 进入今天的主题——在Spring Boot 项目中整合mybatis多数据源,其实很简单,其实并不...

developlee的潇洒人生
35分钟前
11
0
ADB控制电视盒子备忘

连接 adb connect 192.169.2.111 获取安装软件的列表 adb shell pm list package 删除 adb uninstall cn.uc.test 安装 adb install xxx.apk...

乐_然
43分钟前
4
0
Hadoop生态系统

首先我们先了解一下Hadoop的起源。然后介绍一些关于Hadoop生态系统中的具体工具的使用方法。如:HDFS、MapReduce、Yarn、Zookeeper、Hive、HBase、Oozie、Mahout、Pig、Flume、Sqoop。 Hadoop...

瑞查德-Jack
49分钟前
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部