了解Factory方法模式

时间:2012-02-17 09:17:27

标签: php oop factory-pattern

我正在阅读工厂方法模式,因为我有一些与之相关的问题,但我无法从核心理解它。根据定义,here

  

创建对象通常需要复杂的过程   适合包含在作曲对象中。对象的   创建可能会导致严重的代码重复,可能需要   组成对象无法访问的信息可能不提供   足够的抽象水平,或者可能不是其中的一部分   撰写对象的问题。

我可以理解重要代码重复的概念,但我无法理解其他概念,例如它陈述

  

可能需要编写对象无法访问的信息

一个类如何包含组合对象无法访问的信息。据我所知,它可能是该类的任何private数据库。但是,如果有任何事情是private那么对象创建过程如何需要这些信息?同样地,其他两点

  

它可能无法提供足够的抽象级别,或者可能不会成为撰写对象关注的一部分。

任何身体都可以在这里准确地描述这些并展示我的一些代码,以便我能理解这个概念

3 个答案:

答案 0 :(得分:1)

工厂模式的想法是创建加载类并动态创建新对象。通常它是作为静态类(例如官方PHP文档中的here)完成的,但是一些框架使用工厂模式作为在MVC对象中加载对象的方式,例如当您想要加载某些数据时通过模型来看。

工厂模式的想法是效率和资源管理。它仅在尚未加载文件时加载文件并返回新创建的对象。

(请注意,PHP文档中的示例并不理想,最好检查是否已定义类,如果没有,则尝试包含该文件而不是使用include_once())

答案 1 :(得分:1)

当在我们的对象中使用外部资源时,会想到其创建的替代方案:

  1. 使用构造函数
  2. 创建对象
  3. 要求另一个对象为我们的对象创建它(工厂和 工厂方法模式)。这种方式我们的对象不知道如何 创建外部资源但它应该知道要求谁 它(它需要持有对工厂的参考或知道它的类型 在调用静态工厂方法的情况下工厂)
  4. 使用IoC注入外部资源(控制反转) 容器。这样我们的对象就不会对它们一无所知 如何创建外部资源,谁也不负责 实际上,这种方法使工厂模式过时了。

答案 2 :(得分:1)

想象一下,您正在编写一个API,用户可以通过该API创建和使用某个对象。在内部,在API框架中,您希望在某些服务,侦听器,数据库中注册您的对象......

在这里,您有两种不同的方法来处理这种情况:

  • 您可以让用户创建对象,并负责在服务,监听器和数据库中注册它(公开)。

OR

  • 您希望提供一个公共工厂类,它将在给定某些参数的情况下创建对象,并将负责为您执行所有必要的初始化。

第二种方案是隐藏在系统中创建此类对象的所有复杂性的最佳方法。这也隐藏了注册创建对象所需的服务,监听器和数据库。