赞
踩
目录
抽象工厂模式(Abstract Factory Pattern)
责任链模式(Chain of Responsibility)
每一个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题解决方案的核心,这样,就可以在遇到相同的问题时使用该解决方案进行解决,不必进行重复的工作,设计模式的核心在于提供了问题的解决方案,使人们可以更加简单的复用成功的设计与架构。
设计模式有 4 个基本要素:模式名称,问题(应该在何时使用模式,该模式解决了什么问题),解决方案(设计模式的内容),效果(设计模式应用的效果)
使用设计模式的主要目的是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。
设计模式主要被划分为三类:1.创建型模式 2.结构型模式 3.行为型模式
主要用于创建对象,提高了代码的复用性和灵活性
它提供了一种创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。这种模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态,主要用于产品族的构建。
抽象工厂模式的应用场景通常包括需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现的情况。例如,在组装电脑的场景中,用户可以选择不同的CPU、主板、硬盘等配件,而这些配件需要相互兼容。抽象工厂模式可以确保这些配件的兼容性,同时提供一个统一的接口供用户选择和使用。
抽象工厂模式是一种强大的设计模式,适用于需要创建一系列相互依赖的对象,并且希望将这些对象的创建过程与使用过程分离的场景。通过合理使用抽象工厂模式,可以提高软件的可维护性、可扩展性和可重用性。
它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式主要用于构造复杂对象,特别是当构造函数参数很多或有些参数是可选的时候。‘
通过使用构建器模式,可以将参数的设置逐步分解,使得客户端可以根据需要选择性地设置参数,而不需要记住参数的顺序和数量。
构建器模式常用于创建具有多个可选属性的对象,例如配置类、报表生成器等。通过使用构建器模式,可以更加灵活地创建和配置这些对象,同时避免过多的构造函数重载和参数管理问题。
工厂方法模式(factory method)的核心思想是将对象的实例化延迟到子类中进行。在工厂方法模式中,抽象工厂类负责定义创建产品对象的公共接口,而具体的工厂子类则负责实现该接口,创建并返回具体的产品对象。
工厂方法模式是对简单工厂模式的改进。与简单工厂模式相比,制造产品的工厂类不再只有一个,而是每种具体产品类都对应一个生产它的具体工厂类。客户端通常只与抽象工厂类进行交互,通过调用其工厂方法来获取所需的产品对象,而无需关心具体的实现细节。
工厂方法模式主要由以下几个角色组成:
允许通过一个已经创建的实例作为原型,来创建新的对象。这个原型对象本身会创建目标对象,目标对象是原型对象的一个克隆。也就是说,通过原型模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。根据对象克隆深度层次的不同,原型模式可以分为浅度克隆与深度克隆。
浅度克隆:克隆的是对象的引用,因此新对象中的引用仍指向原对象的存储空间
深度克隆:克隆的是对象的值,它会递归地复制引用对象,使得新对象和原对象完全独立,互不影响。
用于确保一个类仅有一个实例,并提供一个全局访问点,在Java、C++、C# 等编程语言中,这种模式很常见,主要用于那些只需要一个对象的场景,如配置文件的读取、线程池、缓存等。
单例模式的核心思想是将类的实例数量限制为一个,并通过静态方法来访问这个唯一的实例。这有助于节省系统资源,提高性能,并避免多个实例可能导致的数据不一致或其他问题。
节省资源:由于单例模式限制了类的实例数量只能有一个,因此可以节省系统资源,避免不必要的内存占用。特别是在需要频繁创建和销毁对象的情况下,使用单例模式可以显著提高资源利用率。
提高性能:由于单例模式避免了重复创建对象的过程,因此在需要频繁使用某个对象时,可以显著提高系统的性能。
简化管理:单例模式提供了全局唯一的访问点,这使得对共享资源的访问和管理变得简单。在需要控制对某个资源的访问时,单例模式非常有用。
易于扩展:在某些情况下,单例模式可以方便地添加新的功能或行为,而无需修改现有的代码。
测试困难:由于单例模式的全局唯一性,测试时可能难以模拟和替换实例。这可能导致测试的难度增加,尤其是在进行单元测试时。
线程安全问题:虽然可以通过一些技巧(如双重检查锁定、静态内部类等)来实现线程安全的单例模式,但这些实现方式可能会增加代码的复杂性和出错的可能性。
单例模式是一种常见的设计模式,主要用于那些只需要一个实例的类,如配置文件管理器、线程池、日志记录器等。
主要用于处理类和对象之间的组合关系,实现更灵活,更可维护的代码结构
它允许将一个类的接口转换成客户端所期望的另一种接口,从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。适配器模式通常用于解决两个已有接口之间不兼容的问题,它充当一个中间件或桥梁,将不兼容的接口转换为兼容的接口。
适配器模式的应用场景广泛,包括系统扩展、接口转换、兼容老版本以及遗留系统升级等。当系统需要扩展时,可能会引入新的类和接口,而原有的客户端可能无法直接使用这些新的类和接口。通过适配器模式,可以将新的接口转换成客户端所期望的接口,使得客户端可以正常使用这些扩展的功能。
它的核心思想是将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种分离使得抽象部分和实现部分可以沿着各自的维度变化,从而提供了系统的灵活性和扩展性。
是一种对象结构型设计模式,主要用于表示具有“整体—部分”关系的层次结构。它将对象组合成树形结构以表示“部分-整体”的层次关系,使得客户端能够以统一的方式处理单个对象和组合对象。
在组合模式中,对象被组织成树形结构,树的每个节点都是一个对象。这些对象可以是叶子节点(表示树的基本组成单元,没有子节点),也可以是组合节点(表示包含其他节点的容器)。无论是叶子节点还是组合节点,它们都实现了相同的接口,因此客户端可以对它们进行一致的操作,而不需要关心它们的具体类型。
组合模式常用于表示如树形菜单、文件系统、公司组织架构等具有整体和部分关系的系统对象层次。
它允许在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)这种模式属于对象结构型模式,通过创建一个包装对象(即装饰)来包裹真实的对象,以提供额外的功能。
动态扩展功能:装饰模式可以在不修改原有类的基础上,动态地给对象增加新的职责和功能。这使得代码的扩展性非常好,可以根据需要随时增加新的装饰器来扩展功能。
开闭原则:装饰模式符合开闭原则,即对扩展开放,对修改封闭。这意味着当需要添加新功能时,不需要修改原有的类,而是通过添加新的装饰器类来实现。
灵活的组合:装饰模式可以组合多个装饰器,以创建具有多种功能的对象。这种组合是动态的,可以根据需要随时改变。
复用性:装饰模式中的装饰器类和被装饰类通常可以独立设计,具有较高的复用性。
设计复杂性:随着装饰器数量的增加,系统的复杂性可能会提高。因为每个装饰器都会增加一些新的行为,当装饰器数量较多时,理解整个系统的行为可能会变得复杂。
性能开销:由于装饰器模式的实现通常涉及多个对象之间的嵌套调用,这可能会带来一定的性能开销。尤其是在处理大量数据时,这种开销可能会更加明显。
装饰器过多可能导致理解困难:当存在过多的装饰器时,可能会使代码阅读者难以理解系统的整体功能和装饰流程。
例如,在软件开发过程中,有时想使用一些现存的组件,但这些组件可能只完成了一些核心功能。在不改变其结构的情况下,可以动态地扩展其功能,这时就可以采用装饰器模式。
它主要为子系统中的一组接口提供一个统一的高层次接口,使得子系统更容易使用。外观模式的核心思想是降低系统的复杂性,并提供一个简单的接口给调用者。这有助于减少系统调用者与子系统之间的耦合度,使得调用者可以更加便捷地使用子系统。
主要用于减少创建对象的数量,进而减少内存占用来提高系统性能。它通过共享对象来尽可能减少内存使用量以及分享信息给尽可能多的相似对象。享元模式特别适合用于只是因重复而导致使用无法令人接受的大量内存的大量对象。
在享元模式中,通常对象的部分状态是可以分享的。常见的做法是将这些可以共享的状态放在外部数据结构中,当需要使用时再将它们传递给享元对象。这种模式的主要目标是重用现有的同类对象,通过减少对象创建来减少内存开销并提高系统性能。
核心思想是为其他对象提供一种代理,以控制对这个对象的访问。
控制访问,当一个对象需要保护,不希望客户端直接访问时,代理模式可以发挥作用。代理对象在客户端和目标对象之间起到中介的作用,可以阻止客户端直接访问目标对象,而是通过代理对象进行间接访问。
增强功能,如果需要给某个对象增强某些功能,代理模式同样适用。代理对象可以在访问目标对象时,添加、删除或修改目标对象的行为,从而实现功能的增强。
解决交互问题,当两个对象之间无法直接交互时,代理模式也可以提供解决方案。通过代理对象作为中介,可以实现两个对象之间的间接交互。
起到很好的保护作用,由于客户端并不直接访问目标对象,而是通过代理对象进行访问,因此可以在代理对象中加入访问控制,从而限制对目标对象的访问。
主要关注对象之间的通信和协作,以实现更高级别的功能
其主要目的是避免请求发送者与多个请求处理者耦合在一起。通过将请求沿着一个对象链进行传递,直到有一个对象处理它为止。
在这种模式中,每个对象都扮演着处理者或传递者的角色。当一个请求被发出时,它首先被传递给链中的第一个对象。如果该对象不能处理该请求,那么它会将请求传递给链中的下一个对象,以此类推,直到请求被某个对象处理为止。
它将一个请求封装为一个对象,使得请求可以被传递、排队、记录或撤销,并且可以方便地实现命令的调用者和请求接收者之间的解耦。
命令模式的主要核心角色包括:
它给定一门语言,定义该语言文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。这种模式的本质在于分离实现与解释执行,通过一个解释器对象处理语法规则,把复杂的功能分离开,并选择需要被执行的功能,然后按照抽象语法树来解释执行,实现相应的功能。
解释器模式的应用场景广泛,包括但不限于编程语言解析、数学表达式计算、数据查询语言解析、配置文件解析、自然语言处理以及机器人控制等。在这些场景中,解释器模式能够方便地解析和执行复杂的语言或表达式。
提供了一种方法来顺序访问一个聚合对象中的各个元素,同时又不暴露该对象的内部表示。
迭代器模式主要由四个部分构成:
迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
定义了一个中介对象来封装一系列对象之间的交互,使得这些对象不必直接相互作用,而是通过中介者对象来间接地进行交互。这样可以使得原有对象之间的耦合变得松散,且可以独立地改变它们之间的交互方式。
在 GUI 界面开发中,中介者模式可以解决基于事件驱动的计算机系统中控件对象之间的复杂交互问题。通过引入中介者对象作为所有控件对象的唯一通信中心和事件处理中心,可以降低系统的耦合性,提高可维护性和可扩展性。
又叫快照模式(Snapshot Pattern)或Token模式,主要目的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
备忘录模式的主要角色包括:
资源消耗大:当需要保存的发起人(Originator)类的成员变量过多时,备忘录对象会占用大量的存储空间。每次保存对象的状态都会消耗一定的系统资源,如果频繁进行状态保存,可能会对系统性能造成一定影响。
状态管理复杂性:备忘录模式需要管理备忘录对象的创建、存储和恢复,这增加了代码的复杂性。如果管理不当,可能会导致状态混乱或数据不一致的问题。
备忘录模式适用于需要保存对象在某一时刻的状态或部分状态,并且不希望直接暴露对象内部状态的场景(不想破坏对象的封装性)。例如,游戏中的存档和读档功能、编辑工具中的“撤销”操作、浏览器中的后退功能等都可以采用备忘录模式来实现。
观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。
观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式将观察者和被观察的对象分离开,定义了对象间的一种一对多的组合关系。
松耦合:观察者和被观察的对象之间是抽象耦合的。这意味着观察者和被观察者可以各自独立地改变和复用,而一个类的变化不会影响到其他的类。
支持广播通信:当被观察者的状态发生改变时,它会自动通知所有注册的观察者。这种机制简化了对多个对象的监听,使得在大型项目中管理和协调组件间的通信变得更加容易。
开闭原则:观察者模式对扩展开放,对修改封闭。这意味着可以容易地添加新的观察者,而无需修改被观察者的代码。
灵活性和可扩展性:由于观察者可以独立存在和改变,因此可以动态地添加或删除观察者,这使得系统更加灵活和可扩展。
过度使用可能导致效率问题:当观察者非常多的时候,每次被观察对象的状态改变都需要通知所有的观察者,这可能会带来一些不必要的计算或操作,从而降低系统性能。
依赖关系不明确:在代码中,如果不仔细管理观察者和被观察者的关系,可能会导致依赖关系变得复杂和混乱,增加了代码的维护难度。
循环依赖:在某些情况下,观察者和被观察者之间可能存在循环依赖,这可能导致内存泄漏或其他问题。
通知顺序问题:在观察者模式中,通知的顺序通常是随机的或者由内部实现决定的。如果顺序对应用来说很重要,那么可能需要额外的逻辑来处理顺序问题。
也叫作状态机模式(StateMachine Pattern),它允许对象在内部状态发生改变时改变它的行为,使得对象看起来好像修改了它的类。其核心思想是将状态与行为绑定,不同的状态对应不同的行为。
状态模式主要包含三个角色:
环境类角色(Context),它定义客户端需要的接口,内部维护一个当前状态实例,并负责具体状态的切换;
抽象状态角色(IState),它定义该状态下的行为,可以有一个或多个行为;
具体状态角色,即实现了抽象状态角色所声明的接口的具体类。
状态模式的应用场景广泛,特别是在那些行为随状态改变而改变的场景中。例如,交通灯可以根据红灯、黄灯、绿灯的状态来改变其行为;游戏中的角色可以根据攻击、防御、逃跑等状态来改变其行为;电梯则可以根据停止、上行、下行等状态来调整其行为。
定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户变化,这意味着算法的实现和使用是分离的,从而提供了行为的灵活性。
策略模式涉及到三个主要角色:
策略模式在处理复杂的业务场景,实现系统的灵活性和可重复性方面发挥着重要作用。例如,在准备系统路由时,可以利用策略模式来实现灵活性和可重用性;在解决复杂的三方链接场景时,策略模式也能帮助我们实现灵活的数据、流程以及结构处理。
它定义了一个算法的骨架,并允许子类为一个或多个步骤提供具体的实现。这使得子类可以在不改变算法结构的前提下,重新定义算法的某些步骤。在软件工程中,模板方法模式提供了一种将不变部分与可变部分分离的机制,从而提高了代码复用性和扩展性。
模板方法模式主要由以下角色组成:
模板方法模式适用于多种场景,特别是在需要一次性实现算法的不变部分,并将可变部分留给子类实现的情境中。这种设计模式在以下场景中特别有用
主要用于在不修改已有对象结构的情况下,定义新的操作方式。它允许你在不改变数据结构的前提下,通过在数据结构中加入一个新的角色——访问者,来执行不同的操作。
在访问者模式中,通常包含以下几个角色:
访问者模式常用于解决一些需要对对象进行遍历或者操作的问题,例如门诊部对不同类型的病人对象进行不同的操作、电商网站对不同类型的商品对象进行不同的处理方法、汽车修理厂对不同类型的汽车对象进行不同的修理方法等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。