Java成神路上之设计模式系列教程之一

千锋-Feri

在Java工程师的日常中,是否遇到过如下问题:

Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式?

什么是设计模式?你是否在你的代码里面使用过任何设计模式?

解释下什么是观察者模式?

使用工厂模式最主要的好处是什么?在哪里使用?

等等相关的问题,那么问题来了,究竟什么是设计模式,它与我们又有什么关系?在我们的日常开发中充当什么样的作用?

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化,也是软件工程的基石脉络,如同大厦的结构一样。

但是,我们需要知道的是,设计模式不是语法也不是规则,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。我们在日常使用的各种主流框架,比如Spring、MyBatis、SpringBoot等,都大量的使用各种设计模式。特别是做项目中需要考虑迭代性和扩容性的时候,这些都是一些不可多得的参考的内容。

说白了,设计模式可以实现提高代码的重用性,是代码更易理解并保证代码的可靠性

其实关于设计模式,是源自1995 年,Gang of Four(GoF)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。

那么这23种设计模式的本质是面向对象设计原则的实际运用,是对类的封装、继承和多态充分的应用和解释。可以这么来说,这些设计模式就是代表着面向对象的核心应用和主题思想。

当然,设计模式只是一个引导,在实际的应用开发中,必须根据具体的需求来选择,比如,对于简单的应用,可能写一个简单的算法要比引入某种设计模式更加容易(ps其实这样的应用充斥着我们日常的开发工作)。但是对于大型应用开发或者框架、工具、中间件设计,用设计模式来组织代码显然更为恰当。

总体来说,我们根据每种设计模式的用途,将设计模式划分为三大类,创建型模式、结构型模式和行为型模式,接下来就分别聊聊这三种的归属:

1、创建型模式:就是用来描述怎如何创建对象,来创建对象的模式,抽象了实例化的过程。创建型模式在创建什么(what)、由谁来创建(who)、以及何时创建(when)这些方面,都为设计者提供了尽可能大的灵活性。一共包含5种设计模式,工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

2、结构型模式:就是讨论的是类和对象的结构,一般采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象实现新的功能(对象结构型模式),一共有7种设计模式,适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

3、行为型模式:就是用来描述类或对象之间如何进行相互协作,关注的是对象的行为,用来解决对象之间的联系问题。一共有11种设计模式,策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

合起来就是5种创建型+7种结构型+11种行为型,一共为23种设计模式,下图附上者23种设计模式之间的相互关系,有助于我们后面持续学习设计模式。

图1-1 23种设计模式之间的相互关系

Java成神路上之设计模式系列教程之一的更多相关文章

  1. 转载_2016,Java成神初年

    原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...

  2. java成神之——安全和密码

    安全和密码 加密算法 公钥和私钥加密解密 生成私钥和公钥 加密数据 解密数据 公钥私钥生成的不同算法 密钥签名 生成加密随机数 基本用法 指定算法 加密对象 SealedObject Signatur ...

  3. java成神之——网络编程基本操作

    网络编程 获取ip UDP程序示例 TCP程序 结语 网络编程 获取ip InetAddress id = InetAddress.getLocalHost(); // InetAddress id ...

  4. java成神之——MySQL Connector/J 的基本使用

    使用示例 DBCP连接池 结语 使用示例 public class demo { static Connection con = null; static Statement st = null; s ...

  5. java成神之——线程操作

    线程 Future CountDownLatch Multithreading synchronized Thread Producer-Consumer 获取线程状态 线程池 ThreadLocal ...

  6. java成神之——Fork/Join基本使用

    Fork/Join 大任务分小任务,小任务结果合并 ForkJoinPool pool = new ForkJoinPool(); RecursiveTask<Integer> task1 ...

  7. java成神之——HttpURLConnection访问api

    HttpURLConnection 访问get资源 访问post资源 访问Delete资源 获取状态码 结语 HttpURLConnection 访问get资源 HttpURLConnection c ...

  8. java成神之——jaxb操作xml的基本使用

    JAXB 依赖 读取xml配置 写配置 自定义写配置 结语 JAXB 依赖 <dependency> <groupId>javax.activation</groupId ...

  9. java成神之——文件IO

    文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...

随机推荐

  1. AJax提交表单数据到后台springmvc接收

    第一种方法直接用serialize()方法 function insert(){ $.ajax({ type:"POST", url:"${pageContext.req ...

  2. FNMP

    Table of Contents 平台 FNMP安装 FNMP配置 php配置 mysql配置 nginx配置 phpMyAdmin配置 平台 freeBSD 12.0 FNMP安装 php安装 v ...

  3. [Leetcode 216]求给定和的数集合 Combination Sum III

    [题目] Find all possible combinations of k numbers that add up to a number n, given that only numbers ...

  4. Laravel 1071 Specified key was too long

    出现错误 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key len ...

  5. xpath简单实用

    一.xpath 基本语法 /html /html/head/title 绝对路径(一层层的查找) /html//title 相对于当前节点 //title/./../.. . 当前节点 ..父节点 . ...

  6. Java Script--------问题错误解决意外的终止输入Uncaught SyntaxError: Unexpected end of input解决办法

    错误信息: Uncaught SyntaxError: Unexpected end of input 错误原因: 一般是成对的符号只出现了单只,比如说“”,‘’,{},[]. 解决办法:检查符号是否 ...

  7. jquery添加属性使用attr、prop。

    之前页面为标签添加属性都是使用的attr,删除使用removeAttr. 今天给checkbox添加checked属性时出现代码显示添加成功,但是页面不勾选内容. 后来查询发现checked是chec ...

  8. shell编程(二)

    第三十二次课 shell编程(二) 目录 十五.shell中的函数 十六.shell中的数组 十七.告警系统需求分析 十八.告警系统主脚本 十九.告警系统配置文件 二十.告警系统监控项目 二十一.告警 ...

  9. 常用的数学函数-S

    // abs — 获取[数值]的绝对值 $; echo abs($int).'<br>'; $float=-2.34; echo abs($float).'<hr>'; //c ...

  10. 使用datepicker和uploadify的冲突解决(IE双击才能打开附件上传对话框)

    在开发的过程当中,IE的兼容无疑是我们的一块绊脚石,在我们使用的如期的datepicker插件和使用上传附件的uploadify插件的时候,两者就产生冲突,只要点击过时间的插件,uploadify上传 ...