1.1概述

保证一个类仅有一个实例,并提供一个访问它的全局访问点。这就是单件模式的定义。

在某些情况下,我们可能需要某个类只能创建一个对象,即不让用户用该类实例化出多于两个的实例。

例如,在一个公文管理系统中,公文类的实例“公文文件”,需要将公章类的实例作为自己的一个成员,以表明自己是一个有效的公文文件,那么系统的设计者就需要保证公章类只有一个实例,不能允许用户使用公章类的构造方法再创建出第2个实例。

单件模式是关于怎样设计一个类,并使该类只有一个实例的成熟模式,该模式的关键是将类的构造方法设置为private权限,并提供一个返回它的唯一实例的类方法(static)。

1.2模式的结构

单件模式的结构非常简单,只有一种角色:

(1)单件类(Singleton):单件类只可以创建出一个实例。

单件模式结构类图如下所示:

单件类的设计有如下特点:

(1)单件类中包含有自身声明的类变量,这个类变量就是单件类唯一的实例。

(2)单件类的构造方法访问权限是private。为了确保单件类中自身声明的类变量是单件类唯一的实例,单件类必须将构造方法的访问权限设置为private。这样一来其他类都无法使用单件类创建的对象。

(3)单件类负责创建自己唯一的实例,并提供访问该实例的类方法。由于单件类的构造方法被设置为private,所以单件类必须自己负责创建自身声明的实例。为了让用户使用单件类这个唯一实例,单件类必须提供一个类方法,以便其他用户使用单件类的类名就可以调用这个类方法访问使用单件类这个唯一实例。

1.3单件模式的优点

(1)单件类的唯一实例由单件类本身控制,所以可以很好地控制用户何时访问它。

1.4适合使用单件模式的情景

(1)当系统需要某个类只能有一个实例

1.5单件模式的使用

以下通过一个简单的问题来描述怎样使用单件模式,这个问题就是创建唯一的月亮。单件模式的类图是所有模式中最简练的,只涉及一个角色:单件类。

(1)对于这个简单的问题,设计的单件类是Moon,代码如下:

package com.liuzhen.fourteen_prototype;public class Moon {private static Moon uniqueMoon;double radius;double distanceToEarth;private Moon(){uniqueMoon = this;radius = 1738;distanceToEarth = 363300;}public static synchronized Moon getMoon(){   //这是一个同步方法if(uniqueMoon == null){uniqueMoon = new Moon();}return uniqueMoon;}public String show(){String s = "月亮的半径是:"+radius+"km,距离地球的距离是:"+distanceToEarth+"km";return s;}
}

(2)模式的具体使用

通过FourteenApplication类来具体实现上述相关类和接口,来实现单件模式的运用,其代码如下:

package com.liuzhen.fourteen_prototype;public class FourteenApplication {public static void main(String[] args){MyFrame f1 = new MyFrame("张三看月亮");MyFrame f2 = new MyFrame("李四看月亮");f1.setBounds(10, 20, 360, 200);f2.setBounds(370, 20, 360, 200);f1.validate();f2.validate();}
}

MyFrame.java代码如下:

package com.liuzhen.fourteen_prototype;import java.awt.Font;
import java.awt.Graphics;import javax.swing.JFrame;@SuppressWarnings("serial")
public class MyFrame extends JFrame{String str;MyFrame(String title){setTitle(title);Moon moon = Moon.getMoon();str = moon.show();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setVisible(true);repaint();}public void paint(Graphics g){super.paint(g);g.setFont(new Font("宋体",Font.BOLD,14));g.drawString(str, 5, 100);}
}

运行结果如下:

参考资料:

      1.Java设计模式/耿祥义,张跃平著.——北京:清华大学出版社,2009.5

转载于:https://www.cnblogs.com/liuzhen1995/p/6032875.html

设计模式学习笔记(十四:单件模式)相关推荐

  1. java 设计模式学习笔记十四 template模版模式

    /**  * 模版  *   * @time 下午09:58:00  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public abs ...

  2. 步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)

    概述 在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性:并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多 ...

  3. 设计模式学习笔记十五——Command模式

    动机:将一组行为抽象为对象,实现行为请求者和行为实现者之间的解耦,并且支持对行为进行记录.撤销.重做.事务等处理. 场景:考虑一系列文档操作:打开.复制.剪切.粘帖. 结构 代码实现 /**//*   ...

  4. java 设计模式学习笔记十 bridge桥模式

    bridge桥模式 将抽象和行为划分开来,各自独立但能动态结合 抽象的接口 /**  * 咖啡抽象类  *   * @time 下午09:14:27  * @author retacn yue  * ...

  5. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  6. 设计模式学习笔记——享元(Flyweight)模式

    设计模式学习笔记--享元(Flyweight)模式 @(设计模式)[设计模式, 享元模式, flyweight] 设计模式学习笔记享元Flyweight模式 基本介绍 享元案例 类图 实现代码 Big ...

  7. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  8. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  9. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

  10. 设计模式学习笔记--Flyweight享元模式

    Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种.Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用,所以叫享元.   此模式解决的是由于大量 ...

最新文章

  1. Comware、VRP、IOS这些操作系统平台你分清了吗?
  2. python续行_python基础(变量,续行符,is,round,if,字符串,日期,数学,参数)...
  3. 怎么暂时关闭网站php,WordPress怎么临时关闭网站进行维护
  4. linux下安装在线mysql,嵌入式 Linux下安装Mysql离线和在线安装
  5. SQLite Tutorial 1 在ubuntu上安装SQLite 3.8.2
  6. linux 安装 PHP fileinfo 扩展
  7. 八大排序算法思想介绍
  8. Ubuntu查看crontab运行日志
  9. android获取进程名,android – 按包名查找正在运行的进程ID
  10. PSD网页切图制作HTML全过程教程
  11. 爬虫中国天气网数据并可视化
  12. Jmeter的基础讲解
  13. 通过端口查看进程和通过进程查看端口
  14. 点云高斯曲率计算(MATLAB)
  15. 华三交换机配置access命令_华三交换机查看配置命令是什么
  16. echarts饼图自动动画_echarts实时旋转饼图效果特效
  17. Unity:Firebase接入Apple登录
  18. USB复合设备调试 STM32
  19. 2019 年 10 月 3 日 - KB4524157 (月度汇总)适用于: Windows 7 Service Pack 1Windows Server 2008 R2 Service Pack 1
  20. 信道容量 Channel capacity

热门文章

  1. linux下常用的文本转换命令1(tr)
  2. 探索ASP.NET MVC5系列之~~~1.基础篇---必须知道的小技能
  3. 分享你最喜欢的技巧和提示(Xcode,Objective-C,Swift,C...等等)
  4. 识别验证码,你有几分成功率?
  5. java画图中运用缓冲解决屏幕闪烁方案二
  6. 业务逻辑实现方式的讨论:存储过程 good or bad?
  7. c语言主程序调用子程序数组,perl子程序返回多个数组到主程序中多个数组
  8. mysql怎么给sex设置默认值_记一次mysql优化操作
  9. linux环境下protobuf的安装与使用
  10. 计算机入门建模观后感,实习生revit学习心得-初学Revit有感