我的一个朋友告诉我,如果我想成为一个好的程序员,那么我需要学习设计模式。我从那个网站开始:https://github.com/kamranahmedse/design-patterns-for-humans
我从简单工厂开始。正如您在该页面中所看到的,您需要实现:
您可以这样使用它(PHP):
$door = DoorFactory::makeDoor(100, 200);
echo 'Width: ' . $door->getWidth();
echo 'Height: ' . $door->getHeight();但是,我想知道为什么我需要类DoorFactory的层,它为我提供了具有给定参数的WoodenDoor的新实例,而我可以这样做:
Door door = new WoodenDoor(100, 200);如果我可以通过使用新的ClassName语句传递给定的构造函数参数来简单地创建实例,那么制造工厂有什么大不了的呢?
编辑
参数,它告诉我可以很容易地通过这个解决方案来管理在许多特定元素废除中发生的更改:
创建给定的类(作为工厂解决方案中的给定工厂类型),如下所示:
类LongWoodenDoor,它扩展了WoodenDoor类,并使用具有给定参数的WoodenDoor构造函数。例如使用超级(“100”,"200");
发布于 2017-10-30 14:26:54
你绝对可以用
Door door = new WoodenDoor(100, 200);来创建门户,但是我想引用您下面的教程中的话:
简单工厂只是为客户端生成一个实例,而不向客户端公开任何实例化逻辑。
工厂的目的是客户端不需要知道任何关于door类构造函数的信息就可以创建一个门。
您的工厂在创建门时根本不需要任何参数:
makeDoor函数:
Door* DoorFactory::makeDoor()
{
Door *newDoor = new Door(200, 100);
return newDoor;
}在你创造大门的地方:
Door door = DoorFactory::makeDoor();在这种情况下,工厂正在封装关于门的信息,这样您就不需要知道门的尺寸了。显然,您希望具有使用自己的维度定义门的灵活性,但在某些情况下,隐藏参数以避免更改是有益的。
另外,如果将来要修改类门的构造函数,请添加另一个名为厚度的参数。
Door::Door(double width, double height, double thickness)您不必更改项目中的每个门实例化,只需在一个地方修改工厂代码:
Door* DoorFactory::makeDoor(double width, double height)
{
Door *newDoor = new Door(width, height, 5);
return newDoor;
}这样,如果项目的需求发生变化,就更容易进行重构。
发布于 2017-10-30 14:49:57
设计模式真的是很好的建议!
而factory method模式也是很好的建议。工厂方法的目的是定义一个创建对象的接口,但是您可以在运行时中确定要创建哪个对象!因此,如果你不知道它是木制的,金属的,还是塑料的-你必须使用工厂的方法。
但是如果你确实知道它是木制的-你可以坚持KISS (保持简单,愚蠢)和YAGNI (你不需要它)的原则。
https://stackoverflow.com/questions/47016990
复制相似问题