工厂模式工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。
工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。工厂模式的类型简单工厂模式(Simple Factory Pattern):简单工厂模式不是一个正式的设计模式,但它是工厂模式的基础。它使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象。工厂方法模式(Factory Method Pattern):工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。抽象工厂模式(Abstract Factory Pattern):抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。概要意图定义一个创建对象的接口,让其子类决定实例化哪一个具体的类。工厂模式使对象的创建过程延迟到子类。主要解决接口选择的问题。何时使用 ...
外观模式外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。介绍意图为一个复杂的子系统提供一个一致的高层接口。这样,客户端代码就可以通过这个简化的接口与子系统交互,而不需要了解子系统内部的复杂性。
主要解决的问题
降低客户端与复杂子系统之间的耦合度。简化客户端对复杂系统的操作,隐藏内部实现细节。
使用场景
当客户端不需要了解系统内部的复杂逻辑和组件交互时。当需要为整个系统定义一个清晰的入口点时。
实现方式
创建外观类:定义一个类(外观),作为客户端与子系统之间的中介。封装子系统操作:外观类将复杂的子系统操作封装成简单的方法。
关键代码
Facade类:提供高层接口,简化客户端与子系统的交互。子系统类:实现具体的业务逻辑,被Facade类调用。
应用实例
医院接待:医院的接待人员简化了挂号、门诊、划价、取药等复杂流程。Java三层架构:通过外观模式,可以简化对表示层、业 ...
备忘录模式备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象,备忘录模式属于行为型模式。备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态。介绍意图在不破坏封装性的前提下,捕获一个对象的内部状态,并允许在对象之外保存和恢复这些状态。主要解决的问题
允许捕获并保存一个对象的内部状态,以便在将来可以恢复到该状态,实现撤销和回滚操作。
使用场景
当需要提供一种撤销机制,允许用户回退到之前的状态时。
实现方式
创建备忘录类:用于存储和封装对象的状态。创建发起人角色:负责创建备忘录,并根据需要恢复状态。创建备忘录管理类(可选):负责管理所有备忘录对象。
关键代码
备忘录:存储发起人的状态信息。发起人:创建备忘录,并根据备忘录恢复状态。
应用实例
后悔药:提供一种撤销操作的功能。游戏存档:保存游戏进度,允许玩家加载之前的存档。Windows中的Ctrl+Z:实现撤销操作。IE浏览器的后退:允许用户回退到之前的页面。数据库事务管理:通过事务日志保存状态,实现回滚。
优点
提供状态恢复机制:允许用户方便地回到历史状态。封装状态信息:用户不需要关心状 ...
命令模式命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。命令模式结构示意图:
介绍意图将请求封装为一个对象,允许用户使用不同的请求对客户端进行参数化。主要解决的问题
解决在软件系统中请求者和执行者之间的紧耦合问题,特别是在需要对行为进行记录、撤销/重做或事务处理等场景。
使用场景
当需要对行为进行记录、撤销/重做或事务处理时,使用命令模式来解耦请求者和执行者。
实现方式
定义命令接口:所有命令必须实现的接口。创建具体命令:实现命令接口的具体类,包含执行请求的方法。调用者:持有命令对象并触发命令的执行。接收者:实际执行命令的对象。
关键代码
接收者(Receiver):执行命令的实际对象。命令(Command):定义执行命令的接口。调用者(Invoker):使用命令对象的入口点。
应用实例
Struts 1:ActionServlet作为Invoker,模型层的类作为具体的Command。
优点
降低耦合度: ...
原型模式原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。概要原型模式意图:使用原型实例指定要创建对象的种类,并通过拷贝这些原型创建新的对象。主要解决:在运行时动态建立和删除原型。何时使用系统应独立于产品的创建、构成和表示。需要在运行时指定实例化的类,例如通过动态加载。避免创建与产品类层次平行的工厂类层次。类的实例只能有几种不同状态组合,克隆原型比手工实例化更方便。如何解决通过已有的一个原型对象,快速生成与原型对象相同的实例。关键代码实现克隆操作:在 Java 中,实现 Cloneable 接口,重写 clone() 方法。在 .NET 中,使用 Object 类的 MemberwiseClone() 方法实现浅拷贝,或通过序列化实 ...
单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。注意:
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。
概要单例模式(Singleton Pattern)意图确保一个类只有一个实例,并提供一个全局访问点来访问该实例。主要解决频繁创建和销毁全局使用的类实例的问题。何时使用当需要控制实例数目,节省系统资源时。如何解决检查系统是否已经存在该单例,如果存在则返回该实例;如果不存在则创建一个新实例。关键代码构造函数是私有的。应用实例一个班级只有一个班主任。Windows 在多进程多线程环境下操作文件时,避免多个进程或线程同时操作一个文件,需要通过唯一实例进行处理。设备管理器设计为单例 ...
前端控制器模式前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
前端控制器(Front Controller) - 处理应用程序所有类型请求的单个处理程序,应用程序可以是基于 web 的应用程序,也可以是基于桌面的应用程序。调度器(Dispatcher) - 前端控制器可能使用一个调度器对象来调度请求到相应的具体处理程序。视图(View) - 视图是为请求而创建的对象。
概要意图使用一个中心控制器(或处理器)来转发客户端请求到适当的处理程序。主要解决的问题
解决Web应用程序中请求处理分散的问题,提供统一的请求处理入口。
使用场景
当需要对Web应用程序中的请求进行统一管理和分发时。
实现方式
前端控制器:作为请求的单一入口点,负责请求的接收和转发。视图:用于呈现处理结果。处理程序:实际执行请求处理的组件。
关键代码
前端控制器:包含逻辑以决定将请求转发到哪个处理程序。 ...
传输对象模式传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为。服务器端的业务类通常从数据库读取数据,然后填充 POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只读的。客户端可以创建自己的传输对象,并把它传递给服务器,以便一次性更新数据库中的数值。以下是这种设计模式的实体。
业务对象(Business Object) - 为传输对象填充数据的业务服务。传输对象(Transfer Object) - 简单的 POJO,只有设置/获取属性的方法。客户端(Client) - 客户端可以发送请求或者发送传输对象到业务对象。
概要意图用于简化网络或应用程序层之间的数据传输。它通过创建一个包含多个属性的类来封装数据,这些属性代表需要传输的数据。主要解决的问题
解决在分布式系统中,尤其是多层应用程序中,数据在层与层之间传输时的效率和封装性问题。
使 ...
代理模式在代理模式(Proxy Pattern)中,一个类代表另一个类的功能,这种类型的设计模式属于结构型模式。代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的请求转发给目标对象,同时可以在转发请求前后进行额外的处理。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。介绍意图为其他对象提供一种代理以控制对这个对象的访问。主要解决的问题
代理模式解决的是在直接访问某些对象时可能遇到的问题,例如对象创建成本高、需要安全控制或远程访问等。
使用场景
当需要在访问一个对象时进行一些控制或额外处理时。
实现方式
增加中间层:创建一个代理类,作为真实对象的中间层。代理与真实对象组合:代理类持有真实对象的引用,并在访问时进行控制。
关键代码
代理类:实现与真实对象相同的接口,并添加额外的控制逻辑。真实对象:实际执行任务的对象。
应用实例
快捷方式:Windows系统中的快捷方式作为文件或程序的代理。角色扮演:孙悟空作为高翠兰的代理,猪八戒无法区分。代售点:购买火车票时,代售点作为火车站的代理。支票:作为银行账户资金的代理,控制资 ...
享元模式享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。概要意图通过共享对象来减少创建大量相似对象时的内存消耗。。主要解决的问题
避免因创建大量对象而导致的内存溢出问题。通过共享对象,提高内存使用效率。
使用场景
当系统中存在大量相似或相同的对象。对象的创建和销毁成本较高。对象的状态可以外部化,即对象的部分状态可以独立于对象本身存在。
实现方式
定义享元接口:创建一个享元接口,规定可以共享的状态。创建具体享元类:实现该接口的具体类,包含内部状态。使用享元工厂:创建一个工厂类,用于管理享元对象的创建和复用。
关键代码
HashMap:使用哈希表存储已经创建的享元对象,以便快速检索。
应用实例
Java中的String对象: ...