Java成神路上之设计模式系列教程之一
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成神路上之设计模式系列教程之一的更多相关文章
- 转载_2016,Java成神初年
原文地址:http://blog.csdn.net/chenssy/article/details/54017826 2016,Java成神初年.. -------------- 时间2016.12. ...
- java成神之——安全和密码
安全和密码 加密算法 公钥和私钥加密解密 生成私钥和公钥 加密数据 解密数据 公钥私钥生成的不同算法 密钥签名 生成加密随机数 基本用法 指定算法 加密对象 SealedObject Signatur ...
- java成神之——网络编程基本操作
网络编程 获取ip UDP程序示例 TCP程序 结语 网络编程 获取ip InetAddress id = InetAddress.getLocalHost(); // InetAddress id ...
- java成神之——MySQL Connector/J 的基本使用
使用示例 DBCP连接池 结语 使用示例 public class demo { static Connection con = null; static Statement st = null; s ...
- java成神之——线程操作
线程 Future CountDownLatch Multithreading synchronized Thread Producer-Consumer 获取线程状态 线程池 ThreadLocal ...
- java成神之——Fork/Join基本使用
Fork/Join 大任务分小任务,小任务结果合并 ForkJoinPool pool = new ForkJoinPool(); RecursiveTask<Integer> task1 ...
- java成神之——HttpURLConnection访问api
HttpURLConnection 访问get资源 访问post资源 访问Delete资源 获取状态码 结语 HttpURLConnection 访问get资源 HttpURLConnection c ...
- java成神之——jaxb操作xml的基本使用
JAXB 依赖 读取xml配置 写配置 自定义写配置 结语 JAXB 依赖 <dependency> <groupId>javax.activation</groupId ...
- java成神之——文件IO
文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...
随机推荐
- 五、docker网络技术
五 docker网络技术 1.本章环境: 源码文件目录: 2.网络基础回顾 通道: NAT将私有地址和端口号翻译成公有的地址和端口号项某网站发出数据包.某网站根据数据表查出私有ip和端口号返回数据. ...
- 浅析HashMap的实现原理
本文参照https://www.cnblogs.com/chengxiao/p/6059914.html#commentform作者的文章,并分享一些自己的体会. 本文将主要回答以下两个问题: 1. ...
- spring中ApplicationListener的用法
1.实现ApplicationListener接口,并重写onApplicationEvent方法 @Component public class RSAKeyInitListener impleme ...
- python常见的数据转化函数
python常用类型转换函数 函数格式 使用示例 描述 int(x [,base]) int("8") 可以转换的包括String类型和其他数字类型,但是会丢失精度 ...
- Python参数笔记
Python参数 1. 普通参数 必须要传入和定义时个数相同的参数 def miao(acfun, bilibili): print(acfun, bilibili) miao(11, 22) > ...
- python 对 sqlite3的简单使用
SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成.Python就内 ...
- 关于centos7无法上网的问题
应该是本机电脑禁用了VMware Nat Service,右击计算机管理点击--服务-- 然后就可以上网了
- 天转凉了,注意保暖,好吗(需求规格说明书放在github了)
团队项目——AI五子棋(小程序) 一.团队展示: 队名:未来的将来的明天在那里等你 小组 队员: 龙天尧(队长)(3116005190),林毓植(3116005188),黄晖朝(3116005178) ...
- 数字特征值-java
题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作x,如果x和n的奇偶性相 ...
- org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open con
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session f ...