工厂/抽象工厂混乱

时间:2011-01-18 01:58:29

标签: php oop design-patterns factory factory-pattern

经过大约10个月的程序化PHP之后,我现在试图围绕基本的OOP原则和设计模式。这是一个爱好,我没有多少时间可以追求它,所以请原谅这个问题相当低的水平。

我的网站(目前100%程序)是图书馆的核心。访问者发送图书馆脚本2个数据点 - 项目type和项目code

Library.php使用项类型来选择包含,include包括抓取代码以访问数据库,然后构建页面。

一些例子:

[type]  [code]
 game    RoTo
 map     32
 unit    216

示例链接为library.php?type=game&code=RoTo

一切都很好,但是当我开始使用OOP时,我看到了明显的简单入口点和继承路径,用于“客观化”这个系统。

class LibraryObject
{
    protected $_name;
    protected $_description;
}

class Game extends LibraryObject
{
    protected $_releaseDate;
    etc.
}

我也对一些写得很好的课程给我的灵活性感到兴奋。

但是,设计模式的想法让我感到沮丧。它似乎是一种工厂模式,但我对 F AF 之间的差异感到困惑。我已经阅读了其他特别提出问题的SO问题,并且我已经阅读了OODesign上的示例,但我觉得它们是用不同的语言编写的,而且相当令人沮丧。

也许如果有人能用我自己的数据结构解释它,那对我来说会更有意义吗?

不好意思。

2 个答案:

答案 0 :(得分:32)

工厂抽象工厂之间的区别非常简单。在后者中,工厂本身是抽象的(!),不能直接实例化,但必须是子类。

每个例子,工厂:

class Document {
   public function createPage() {
       return new Page;
   }
}

class LandscapeDocument extends Document {
   public function createPage() {
       return new LandscapePage;
   }
}

抽象工厂:

abstract class Document {
   abstract public function createPage();
}

class PortraitDocument extends Document {
   public function createPage() {
      return new PortraitPage;
   }
}

class LandscapeDocument extends Document {
   public function createPage() {
      return new LandscapePage;
   }
}

简而言之,Factory模式在工厂类本身中有一个默认实现。抽象工厂要求所有子类实现自己的工厂方法版本。

这就是它的全部内容。

答案 1 :(得分:1)

您可以通过以下方式查看它:

清除灌木丛:
工厂模式是一种创造模式。也就是说,它用于创建使用的实例。

  

工厂模式

  • 创建实例的逻辑位于Factory类的手中的创建模式。
  • 工厂模式仅创建一种类型的对象实例。在您的情况下,它将创建 LibraryObject 类型的对象,假设LibraryObject是层次结构树中最顶层的对象。
  

抽象模式(工厂工厂)

  • 一种创建模式,其中创建实例的逻辑掌握在实现Factory 接口/抽象类的类的手中。
  • 抽象工厂模式可以创建不同类型的对象,因此您可以使用Factory接口/抽象类的具体实现来创建所需类型的对象。这就是为什么它被称为工厂工厂。

下面这个链接是一个很好的参考,我建议你也阅读工厂方法模式:
http://www.oodesign.com/creational-patterns/