原型模式
原型导致克隆的对象与原始对象不同。在克隆时,原始状态与克隆相同。此后,每个对象都可能经历状态变化。您可以将其视为类似复印原件,然后在几个地方修改复印件。
例子
- DVD 复制:复制主 dvd 以创建多个副本
- 报告对象:考虑一个包含要传递到 GUI 的已处理信息的报告对象。原始报告包含按升序排列的数据。现在,使用这种模式可以创建一个类似的报告,但数据按降序排序。
好处
- 性能:克隆(使用MemberwiseClone)比重新创建新对象(使用new operator)要便宜得多。请注意,需要覆盖
MemberwiseClose()
才能执行深层复制。
- 对象可以非常动态地克隆,无需任何预先实例化。第一个创建的对象可以在应用程序执行中的任何时间创建,并且可以在任何时间提前进行进一步的复制。
何时使用
- 在运行时指定要实例化的类时,例如,通过动态加载。
- 当类的实例可以具有仅有的几种不同状态组合之一时。安装相应数量的原型并克隆它们可能更方便,而不是手动实例化类,每次都具有适当的状态。
与工厂模式的比较
原型模式允许对象在不知道它们的类或如何创建它们的任何细节的情况下创建自定义对象。因此,正是在这一方面,它看起来很像工厂方法模式。在这两种模式中,客户端可以创建任何派生类对象,而无需了解它们自己的结构。
但是这两种模式之间的区别在于,Factory Method
专注于创建一个不存在的对象类型的对象作为 a fresh creation
(通过了解 Creator 类的确切子类型)。该Prototype
模式使用类本身,尤其是派生类进行self duplication
操作。
工厂方法模式
在这种模式中,客户端(或消费者)向创建者(或工厂)请求来自类层次结构的特定类型的对象。工厂类的 Creator 方法将特定对象的创建委托给派生类,并返回客户端要求的类型的类的对象。实质上,您有一个单一的联系点来创建类层次结构的多个对象。
您可以将其视为前往机票柜台(控制器)并通过提供您对机票类型(头等舱、行政或经济舱)的偏好来索取机票。用户并不关心如何生成机票,即使在对象表示中头等舱和经济舱机票都是从基本机票类别派生的。
何时使用
- 灵活性很重要(低耦合)
- 对象可以在子类中扩展
- 选择一个子类而不是另一个子类有一个特定的原因——这个逻辑构成了工厂方法的一部分。
- 客户端将责任委托给并行层次结构中的子类。
抽象工厂模式
抽象工厂比工厂方法模式更高(更抽象)。在这种情况下,可以不只是一个工厂,而是多个工厂,略有不同。它负责创建属于类层次结构系列的对象,而不仅仅是单个类层次结构。
一个特定的工厂类已经存在。但是工厂的方法会略有不同。每个方法都可以产生一个实例。客户端可以选择合适的方法并获取实例。
如果以基于MVC的完美架构设计为例,客户端将是业务控制器类,而具体产品将都是业务实体。工厂是辅助(帮助)控制器。他们与来自业务控制器的请求相关联。
何时使用
- 该系统预计将独立于其产品的创建方式。它甚至可能期望独立于产品的组成和表示方式。术语产品适用于客户端开发人员需要通过调用其方法来使用的最终结果对象。
- 该系统应可配置为多个产品系列之一。所以家庭的实际选择不会在编码时而是在以后的配置时。
- 该系列产品旨在始终协同工作。
- 该创建是针对产品库的。这里更关心的是相关的接口而不是实现。