设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。

Slides:



Advertisements
Similar presentations
主要内容 Java 的常用包 Java 的常用包 “ == ” 和 “ equals ” 的用法 “ == ” 和 “ equals ” 的用法 基本数据类型与引用类型 基本数据类型与引用类型 String 和 StringBuffer String 和 StringBuffer 对象的克隆( clone.
Advertisements

软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
面向对象与设计模式 RD 常见编程范式介绍  并行编程 - Process-orientedProcess-oriented  组件编程 - Component-basedComponent-based  事件驱动 - Service-oriented,Time-drivenService-orientedTime-driven.
第6章 对象和类.
Java语言的特点 Java开发环境的搭建
第三讲 面向对象(上).
第 9 章 物件的建構.
职业指导服务系统 欢迎了解职业指导服务系统!
项目7 面向对象高级.
项目6 通用堆栈.
壹、緣起 在「夢想大作戰」的主題裡,主要分為「個人挑戰」與「小組挑戰」兩個部份,當個人挑戰陸續完成後,緊接著進入小組挑戰的階段。
會計資訊系統 專章A.
第三章 調整與編表.
Java的程式架構與基本觀念 Java語言的歷史 Java程式的開發環境 Java程式的架構 輸出與輸入物件之使用 工具使用方法介紹
PPP规范性文件的解读 主讲人:王周欢 2016年4月.
四資二甲 第三週作業 物件導向程式設計.
Memory Pool ACM Yanqing Peng.
提高自身素质做好 新时期班主任工作 北京市广渠门中学 高金英.
普通话模拟测试 与学习平台 使用指南.
網路小說劇情建構與伏線營造 Windows98.
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
102學年度預算編製說明會 主辦單位:會計室 102/02/22.
第一章 面向对象程序设计.
中国公务员制度 主讲:吴春华 教授 温志强 副教授.
关于整合检验检测认证机构实施意见的通知(国办发〔2014〕8号)
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
推进德育创新 做好新时期班主任工作 北京市广渠门中学 高金英.
第二章 JAVA语言基础.
類別與物件 Class & Object.
AOP实践 演讲人:陈思荣.
第9章 单例模式 Website:
第9课 北美大陆上的新体制 导入新课 新课教学 课堂小结 知识结构 巩固练习
Ch08 巢狀類別 物件導向程式設計(II).
CHAPTER 9 建構方法 ROBERT.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
程式設計實作.
创建型设计模式.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
程序设计期末复习 黎金宁
第9章 多线程 王德俊 上海交通大学继续教育学院.
并发机制 结果应该为: 线程 1: 1 线程 1: 2 线程 1: 3 线程 1: 4 线程 1: 5 线程 2: 6 线程 2: 7
C/C++/Java 哪些值不是头等程序对象
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
简单工厂模式.
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
Classes (2) Lecture 7.
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
计算机网络概述 计算机网络原理与技术.
C#程序设计基础 $3 成员、变量和常量.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
Interfaces and Packages
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
第五次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
所得稅法第14條、第126條修正條文 薪資所得計算方式二擇一 定額減除 特定費用減除 維持現行薪資所得特別扣除額20萬元減除方式
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
104 四技二專甄選入學 簡章解析 輔導室 何乙娟.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第四章 買賣業會計.
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Presentation transcript:

设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。 我们为什么要学习设计模式 ??? 设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。

Singleton Pattern 单例模式 组长:田大海 组员:章凯、刘宇轩、陈梁、曾博晖、陈柱、 王子剑

什么是单例模式? 单例模式是一种常用的软件设计模式。在它的核心 结构中只包含一个被称为单例类的特殊类。 通过单例模式可以保证系统中一个类只有一个实例 而且该实例易于被外界访问,从而方便控制实例个数以 及节约系统资源。

单例类的特征—— 单例类只能有一个实例 单例类必须自行创建自己的唯一实例 单例类必须自行为整个系统提供这一实例

什么样的情况下,我们需要单例模式? 类的任意一个实例对象没 有异于其他实例对象的状 态。也就是说无论实例化 出多少个对象,都是一样 的,不但对于系统性能方 面没有任何额外贡献,而 且还会浪费系统资源。 当类有两个或者两个以上的实例对象的话,会产生程序错误或者与现实相违背的逻辑错误。

For Example: Windows的任务管理器。一台正常的计算机上是不可能同时打开 两个任务管理器的。 windows的回收站。在整个系统运行过程中,回收站一直维护着 仅有的一个实例。

public class Singleton { //一个静态的实例 private static Singleton singleton; //私有化构造函数 private Singleton(){} //给出一个公共的静态方法返回一个单一实例 public static Singleton getInstance(){ if (singleton == null) { singleton = new Singleton(); } return singleton; 最容易想到、最原始 的单例模式的构造方式

真的可以保证只创造一个实例吗??? 1.静态实例,带有static关键字的属性在每一个类中都 是唯一的。 2.限制客户端随意创造实例,即私有化构造方法,此为保 证单例的最重要的一步。 3.给一个公共的获取实例的静态方法。 4.判断只有持有的静态实例为null时才调用构造方法创 造一个实例,否则就直接返回。 真的可以保证只创造一个实例吗???

public class Singleton { //一个静态的实例 private static Singleton singleton; //私有化构造函数 private Singleton(){} //给出一个公共的静态方法返回一个单一实例 public synchronized static Singleton getInstance(){ if (singleton == null) { singleton = new Singleton(); } return singleton; 考虑到多线程并发

将整个获取实例的方法同步,这样在一个线程访 问这个方法时,其它所有的线程都要处于挂起等待状态, 避免了刚才同步访问创造出多个实例的危险。 糟糕的设计!!!造成了很多无谓的等待。

public class Singleton { //一个静态的实例 private static Singleton singleton; //私有化构造函数 private Singleton(){} //给出一个公共的静态方法返回一个单一实例 public static Singleton getInstance(){ if (singleton == null) { synchronized (this) { singleton = new Singleton(); } return singleton; 双加锁模式

这种模式的优点在于:它只是在当前实例为null, 也就是实例还未创建时才进行同步,否则就直接返 回已创建好的实例。这样就节省了很多无谓的线程 等待时间,同时还保证了线程安全。 推荐

public class Singleton { private Singleton(){} public static Singleton getInstance(){ return SingletonInstance.instance; } private static class SingletonInstance{ static Singleton instance = new Singleton(); 静态内部类

一个类的静态属性只会在第一次加载类时初始化,这是 JVM帮我们保证的,所以我们无需担心并发访问的问题。 所以在初始化进行一半的时候,别的线程是无法使用的, 因为JVM会帮我们强行同步这个过程。另外由于静态变 量只初始化一次,所以singleton仍然是单例的。 推荐

public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } 其他方式

这种方式最主要的缺点就是一旦我访问了Singleton的任何其他的 静态域,就会造成实例的初始化,而事实是可能我们从始至终就 没有使用这个实例,就会造成内存的浪费。 不过在有些时候,直接初始化单例的实例也无伤大雅,对项目几 乎没什么影响。比如我们在应用启动时就需要加载的配置文件等, 就可以采取这种方式去保证单例。 推荐

单例模式的优点—— 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所 有对象都访问唯一实例。 二、灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程。 三、节省空间,减少不必要的浪费。

谢谢大家!