接口和类与简单工厂设计模式

时间:2017-10-30 13:53:34

标签: php design-patterns factory-pattern

我的一位朋友告诉我,如果我想成为一名优秀的程序员,那么我需要学习设计模式。我开始在那个网站上: https://github.com/kamranahmedse/design-patterns-for-humans

我从Simple Factory开始。 正如您在该页面上看到的那样,您需要实现:

  • 界面门
  • class WoodenDoor
  • class DoorFactory

你可以这样使用它(PHP):

$door = DoorFactory::makeDoor(100, 200);
echo 'Width: ' . $door->getWidth();
echo 'Height: ' . $door->getHeight();

但是我想知道为什么我需要一个类DoorFactory层,它给我带有给定参数的WoodenDoor的新实例,当我可以这样做时:

Door door = new WoodenDoor(100, 200);

当我可以通过使用新的ClassName语句传递给定的构造函数参数来简单地创建实例时,制作该工厂有什么大不了的?

EDITED

这个解决方案告诉我可以通过这个解决方案轻松管理许多出现给定元素废除的变化:

创建一个给定的类(作为工厂解决方案中的给定工厂类型),如:

类LongWoodenDoor,它扩展了WoodenDoor类并使用具有给定参数的WoodenDoor构造函数。例如,使用super(" 100"," 200");

2 个答案:

答案 0 :(得分:0)

你绝对可以使用

Door* DoorFactory::makeDoor()
{
    Door *newDoor = new Door(200, 100);
    return newDoor;
}

创建门,但我会引用您所关注的教程:

  

简单工厂只是为客户端生成实例而不向客户端公开任何实例化逻辑

工厂的目的是客户不需要了解门类的构造函数以创建门。

创建门时,您的工厂根本不会参数:

makeDoor功能:

Door door = DoorFactory::makeDoor();

你创造门的地方:

Door::Door(double width, double height, double thickness)

在这种情况下,工厂正在封装有关门的信息,因此您无需了解门的尺寸。显然,您希望能够灵活地使用自己的维度定义门,但在某些情况下,隐藏参数以避免更改是有益的。

此外,如果您希望将来修改类Door的构造函数,请说添加另一个名为 thickness 的参数:

Door* DoorFactory::makeDoor(double width, double height)
{
    Door *newDoor = new Door(width, height, 5);
    return newDoor;
}

您不必更改项目中的每一个门实例,您只需在一个地方修改您的工厂代码:

t(df)

如果项目的需求发生变化,那么重构更容易。

答案 1 :(得分:0)

设计模式是非常好的建议!
{factory method模式也是很好的建议。工厂方法的目的是定义用于创建对象的接口,但是您可以在运行时中确定要创建的对象!因此,如果您不知道它是木制的还是金属或塑料门 - 您必须使用工厂方法。

但如果你肯定知道它将是木制的 - 你可以坚持 KISS (保持简单,愚蠢)和 YAGNI (你不需要它)原则。