文档章节

小博老师解析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();

 

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

© 著作权归作者所有

共有 人打赏支持
博为峰教研组
粉丝 49
博文 1224
码字总数 479077
作品 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设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之所...

路小磊
07/21
0
10
Java之美[从菜鸟到高手演变]之设计模式

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

只想一个人静一静
2014/02/25
0
2
Java 设计模式(14) —— 复合模式

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

磊_lei
05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

获取多个集合列表的笛卡尔积

获取多个集合笛卡尔积 电商中典型业务场景:商品搜索 单属性属性值之间为并查询 不同属性的属性值之间查询为与查询 import java.util.ArrayList;import java.util.List;/** * Created w...

键走偏锋
19分钟前
0
0
echarts 迁移地图 控制鼠标缩放大小比例

在网上找了好久没有找到解决方式,还是重新看了一下文档,终于找到的解决方案, zoom:1, //默认显示级别 scaleLimit:{min:1,max:3}, // 缩放级别 echarts 文档-配置项链接 http://echarts.b...

心驰
23分钟前
0
0
Boot2Docker ISO is out-of-date,

Boot2Docker ISO is out-of-date, downloading the latest release. 使用docker-machine时无法更新Boot2Docker ISO导致创建vm machine失败 解决方法:关闭网络,创建好之后再开启...

writeademo
31分钟前
0
0
在 Tomcat 中设置 Tapestry 框架的 html 热加载

如果开发中使用到了 Tapestry 这个框架,如果事先没有设置过的话,开发的时候 html 是不会热加载的,也就是说修改了 html 文件,不能刷新浏览器后立马看到修改完的效果,必须先重新启动应用服...

LeoXu
53分钟前
0
0
【微服务】开启巨石应用到微服务的探索

背景 在过去的一年时间里,我一直在从事一件事情,将现有的单体应用(巨石应用)向微服务改造。 接下来,将持续整理一些在微服务路上的学习与成长。 为什么要做微服务 单体应用,开发、部署简...

艳沐石
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部