首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口和类与简单工厂设计模式

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

Stack Overflow用户
提问于 2017-10-30 13:53:34
回答 2查看 514关注 0票数 1

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

我从简单工厂开始。正如您在该页面中所看到的,您需要实现:

  • 接口门
  • 类WoodenDoor
  • 类DoorFactory

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

代码语言:javascript
复制
$door = DoorFactory::makeDoor(100, 200);
echo 'Width: ' . $door->getWidth();
echo 'Height: ' . $door->getHeight();

但是,我想知道为什么我需要类DoorFactory的层,它为我提供了具有给定参数的WoodenDoor的新实例,而我可以这样做:

代码语言:javascript
复制
Door door = new WoodenDoor(100, 200);

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

编辑

参数,它告诉我可以很容易地通过这个解决方案来管理在许多特定元素废除中发生的更改:

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-10-30 14:26:54

你绝对可以用

代码语言:javascript
复制
Door door = new WoodenDoor(100, 200);

来创建门户,但是我想引用您下面的教程中的话:

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

工厂的目的是客户端不需要知道任何关于door类构造函数的信息就可以创建一个门。

您的工厂在创建门时根本不需要任何参数:

makeDoor函数:

代码语言:javascript
复制
Door* DoorFactory::makeDoor()
{
    Door *newDoor = new Door(200, 100);
    return newDoor;
}

在你创造大门的地方:

代码语言:javascript
复制
Door door = DoorFactory::makeDoor();

在这种情况下,工厂正在封装关于门的信息,这样您就不需要知道门的尺寸了。显然,您希望具有使用自己的维度定义门的灵活性,但在某些情况下,隐藏参数以避免更改是有益的。

另外,如果将来要修改类门的构造函数,请添加另一个名为厚度的参数。

代码语言:javascript
复制
Door::Door(double width, double height, double thickness)

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

代码语言:javascript
复制
Door* DoorFactory::makeDoor(double width, double height)
{
    Door *newDoor = new Door(width, height, 5);
    return newDoor;
}

这样,如果项目的需求发生变化,就更容易进行重构。

票数 0
EN

Stack Overflow用户

发布于 2017-10-30 14:49:57

设计模式真的是很好的建议!

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47016990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档