Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 接口和类与简单工厂设计模式_Php_Design Patterns_Factory Pattern - Fatal编程技术网

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

Php 接口和类与简单工厂设计模式,php,design-patterns,factory-pattern,Php,Design Patterns,Factory Pattern,我的一个朋友告诉我,如果我想成为一名优秀的程序员,那么我需要学习设计模式。我从那个网站开始: 我从简单的工厂开始。 正如您在该页面上看到的,您需要实现: 接口门 木匠类 门类工厂 您可以这样使用它(PHP): 但我想知道为什么我需要类DoorFactory的层,它为我提供了具有给定参数的WoodenDoor的新实例,而我可以简单地执行以下操作: Door door = new WoodenDoor(100, 200); 当我可以通过使用新的ClassName语句传递给定的构造函数参数来简

我的一个朋友告诉我,如果我想成为一名优秀的程序员,那么我需要学习设计模式。我从那个网站开始:

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

  • 接口门
  • 木匠类
  • 门类工厂
您可以这样使用它(PHP):

但我想知道为什么我需要类DoorFactory的层,它为我提供了具有给定参数的WoodenDoor的新实例,而我可以简单地执行以下操作:

Door door = new WoodenDoor(100, 200);
当我可以通过使用新的ClassName语句传递给定的构造函数参数来简单地创建实例时,创建工厂有什么大不了的


编辑 参数,表明我可以轻松管理给定元素多次发生的更改,并通过此解决方案撤销:

创建给定类(作为factory解决方案中的给定factory类型),如:


类LongWoodenDoor,它扩展WoodenDoor类并使用带有给定参数的WoodenDoor构造函数。e、 g使用超级(“100”、“200”)

你绝对可以使用

Door door = new WoodenDoor(100, 200);
创建门,但我要引用以下教程:

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

工厂的目的是,为了创建门,客户机不需要知道任何关于door类的构造函数的信息

在创建门时,您的工厂无法获取任何参数:

makeDoor功能:

Door* DoorFactory::makeDoor()
{
    Door *newDoor = new Door(200, 100);
    return newDoor;
}
在创建门的位置:

Door door = DoorFactory::makeDoor();
在这种情况下,工厂封装了关于门的信息,这样您就不需要知道门的尺寸。显然,您希望能够灵活地使用自己的尺寸定义门,但在某些情况下,隐藏参数以避免更改是有益的

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

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

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

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

您肯定可以使用

Door door = new WoodenDoor(100, 200);
创建门,但我要引用以下教程:

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

工厂的目的是,为了创建门,客户机不需要知道任何关于door类的构造函数的信息

在创建门时,您的工厂无法获取任何参数:

makeDoor功能:

Door* DoorFactory::makeDoor()
{
    Door *newDoor = new Door(200, 100);
    return newDoor;
}
在创建门的位置:

Door door = DoorFactory::makeDoor();
在这种情况下,工厂封装了关于门的信息,这样您就不需要知道门的尺寸。显然,您希望能够灵活地使用自己的尺寸定义门,但在某些情况下,隐藏参数以避免更改是有益的

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

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

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

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

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


但是,如果你确实知道它将是木制的,那么你可以坚持吻(保持简单,愚蠢)和雅格尼(你不需要它)原则。

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


但是如果你肯定知道它是木制的,你可以坚持用亲吻(保持简单,愚蠢)和雅格尼(你不需要它)原则。

构造函数与工厂模式:@BenRoob我相信你把工厂模式与静态工厂方法混淆了……构造函数与工厂模式:@BenRoob我相信你把工厂模式与静态工厂方法混淆了……好的。但我可以创建一个类,例如LongWoodenDoor,它将实现WoodenDoor。在LongWoodEndor构造函数中,它将使用常量参数简单地调用super(WoodEndor构造函数)。我会把它叫做Door Door=new LongWoodeDoor();我这里也没有关于尺寸的信息,你可以这样做:
DoorFactory::makeDoor(“普通木门”)
门工厂::makeDoor(“长木门”)然后在工厂中修改逻辑。对不起,我没有很多使用Factory.ok的经验。但我可以创建一个类,例如LongWoodenDoor,它将实现WoodenDoor。在LongWoodEndor构造函数中,它将使用常量参数简单地调用super(WoodEndor构造函数)。我会把它叫做Door Door=new LongWoodeDoor();我这里也没有关于尺寸的信息,你可以这样做:
DoorFactory::makeDoor(“普通木门”)
门工厂::makeDoor(“长木门”)然后在工厂中修改逻辑。对不起,我没有很多使用工厂的经验。但我也能确定