设计模式 建造者模式
有时,一个对象会由不同的部件组成,一些情况下,在某些部件没有恰当的值之前,对象不能作为一个完整的产品使用,甚至有时候,一个对象的组成部件必须按照某个顺序赋值才有意义。建造者模式利用导演者对象以及具体建造者对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
有时,一个对象会由不同的部件组成,一些情况下,在某些部件没有恰当的值之前,对象不能作为一个完整的产品使用,甚至有时候,一个对象的组成部件必须按照某个顺序赋值才有意义。建造者模式利用导演者对象以及具体建造者对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
工厂模式负责将大量拥有共同接口的类实例化,它可以动态决定将哪一个类实例化
单例模式的意思就是确保某个类的实例在系统中只有一个,可以简单概括为以下三点:
设计模式的主要目标在于保证程序的高可用及高扩展性,在实际开发中不应该过多地纠结使用哪种设计模式,而是应该多体会设计模式的原则,换言之,只要遵循一定的原则,这些所谓的模式完全可能在无意识的状态下自发出现在产品代码中。其实这些设计模式也都不是谁突然间硬想出来的,而是从大量实践中总结出来的比较好的组织代码结构的方式。
好的设计能够有效避免或者延缓程序架构的腐化,通常,很多程序结构一开始也许设计得还可以,但随着业务功能的不断扩展和变化,可能就不得不在结构上做出一些妥协让步,慢慢地也就失去了结构。
另外,在设计过程中也要注意避免过度设计,即为不可能发生的变动付出过多的复杂度代价。总之不要滥用设计模式,不要觉得一个地方有可能会变动,就忍不住考虑是否应该增加复杂度来换取灵活性。而要避免过度设计,关键在于能正确的预见变化,以及权衡所引入的复杂度相对于发生变化的可能性和破坏力是否值得,当然这些都需要一定的经验积累以及对业务的认识。
在面向对象的设计中,类的关系涉及依赖、关联、聚合、组合和泛化这五种关系,耦合程度依次递增。
对于网络I/O通信,其实站在应用程序的角度,就是面向Socket进行读写的过程,至于如何建立连接,数据包如何传输等问题则由TCP/IP以及更底层的协议保障,这些通常由操作系统和底层硬件负责实现,它们的目的就是希望能简化应用程序的开发。
在Linux系统中,一切皆文件,所以Socket也统一抽象为一个文件描述符,那么对应用程序来讲,收发消息就是对一个文件描述符进行读写。但是它与读写普通的本地磁盘文件也有区别,由于网络的延迟和不可靠性,在读Socket的过程中可能会有大量的时间花在等待数据包的到达上,因此如何提高应用程序在读写Socket过程中的响应性,就成了网络通信编程中一个很重要的问题。
针对网络I/O,Linux提供了五种IO模型,具体可以参考笔记
不过Java并没有全部支持,而是逐步选择支持了三种模型: 在JDK1.4之前,Java的IO模型只支持阻塞式IO(Blocking IO),简称为BIO; 在JDK1.4时,Java支持了I/O多路复用模型, 简称NIO,即新IO模型,不过现在JDK1.8早已成为主流版本,已经没什么新鲜了,所以更多的人愿意将它理解为非阻塞I/O,即None-Blocking IO; 在JDK1.7时,Java对NIO包进行了升级,支持异步I/O(Asynchronous IO),简称为AIO,因为是对nio包的升级,所有也称为NIO2.0;