文档章节

小博老师解析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
python 与设计模式 ——工厂与单例

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

duoduo3_69
2013/11/27
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

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

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

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

Aduroidpc
2016/10/01
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
20
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
15
0
my.ini

1

architect刘源源
今天
12
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
14
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部