或称
工具包
目的
提供一个用于创建相关对象家族的接口,而无需指定其具体类。
解释
真实世界例子
要创建一个王国,我们需要具有共同主题的对象。精灵王国需要精灵国王、精灵城堡和精灵军队,而兽人王国需要兽人国王、兽人城堡和兽人军队。王国中的对象之间存在依赖关系。
通俗的说
工厂的工厂; 一个将单个但相关/从属的工厂分组在一起而没有指定其具体类别的工厂。
维基百科上说
工具包
提供一个用于创建相关对象家族的接口,而无需指定其具体类。
真实世界例子
要创建一个王国,我们需要具有共同主题的对象。精灵王国需要精灵国王、精灵城堡和精灵军队,而兽人王国需要兽人国王、兽人城堡和兽人军队。王国中的对象之间存在依赖关系。
通俗的说
工厂的工厂; 一个将单个但相关/从属的工厂分组在一起而没有指定其具体类别的工厂。
维基百科上说
将复杂对象的构造与其表示分开,以便同一构造过程可以创建不同的表示。
现实世界例子
想象一个角色扮演游戏的角色生成器。最简单的选择是让计算机为你创建角色。但是如果你想选择一些像专业,性别,发色等角色细节时,这个角色生成就变成了一个渐进的过程。当所有选择完成时,该过程也将完成。
用通俗的话说
允许你创建不同口味的对象同时避免构造器污染。当一个对象可能有几种口味,或者一个对象的创建涉及到很多步骤时会很有用。
转换器模式的目的是提供相应类型之间双向转换的通用方法,允许进行干净的实现,而类型之间无需相互了解。此外,Converter模式引入了双向集合映射,从而将样板代码减少到最少。
真实世界例子
在真实的应用中经常有这种情况,数据库层包含需要被转换成业务逻辑层DTO来使用的实体。对于潜在的大量类进行类似的映射,我们需要一种通用的方法来实现这一点。
通俗的说
转换器模式让一个类的实例映射成另一个类的实例变得简单
依赖注入是一种软件设计模式,其中一个或多个依赖项(或服务)被注入或通过引用传递到一个依赖对象(或客户端)中,并成为客户端状态的一部分。该模式将客户的依赖关系的创建与其自身的行为分开,这使程序设计可以松散耦合,并遵循控制反转和单一职责原则。
真实世界例子
老巫师喜欢不时地装满烟斗抽烟。 但是,他不想只依赖一个烟草品牌,而是希望能够互换使用它们。
通俗的说
依赖注入将客户端依赖的创建与其自身行为分开。
在工厂类中提供一个封装的静态工厂方法,用于隐藏对象初始化细节,使客户端代码可以专注于使用,而不用关心类的初始化过程。
现实例子
假设我们有一个需要连接到 SQL Server 的 Web 应用,但现在我们需要切换到连接 Oracle。为了不修改现有代码的情况下做到这一点,我们需要实现简单工厂模式。在这种模式下,可以通过调用一个静态方法来创建与给定数据库的连接。
使用分离的构建器和工厂接口来定义一个不可变内容的工厂。
工厂套件模式适用于与以下场景:
虚拟构造器
为创建一个对象定义一个接口,但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类。
真实世界例子
铁匠生产武器。精灵需要精灵武器,而兽人需要兽人武器。根据客户来召唤正确类型的铁匠。
通俗的说
它为类提供了一种把实例化的逻辑委托给子类的方式。
维基百科上说
确保一个类只有一个实例,并为其提供一个全局访问点。
情境示例
巫师们之在一个象牙塔中学习他们的魔法,并且始终使用同一座附魔的象牙塔。
这里的象牙塔是一个单例对象。
通俗来说
对于一个特定的类,确保只会创建一个对象。
维基百科说
在软件工程中,单例模式是一种软件设计模式,它将类的实例化限制为一个对象。当系统中只需要一个对象来协调各种操作时,这种模式非常有用。
分步构建
这是构建者模式的一个扩展,完全指导用户创建对象,没有混淆的机会。
用户体验会大大提升,因为他只能看到下一个步骤的方法,直到适当的时机才会出现构建对象的“build”方法。
使用分布构建模式当创建复杂对象的算法需要独立于组成对象的部分以及它们的组装方式,且构造过程必须允许对象有不同的表示形式,并且在此过程中顺序很重要时。
值对象
提供的对象应遵循值语义而不是引用语义。这意味着两个值对象的相等性不是基于它们的身份。只要两个值对象的值相同,即使它们不是同一个对象,它们也被认为是相等的。
现实世界例子
在一个角色扮演游戏中,有一个用于英雄属性统计的类。
这些统计属性包括力量、智慧和运气等特征。
当所有的属性都相同时,不同英雄的统计数据应被认为是相等的。
用直白的话来说
当值对象的属性有相同的值时,它们是相等的。