1)在简单工厂中,它说它很糟糕,因为它违反了开闭原则。我理解这一点,但在工厂方法模式中,它所做的仍然违反了开闭原则。
if ('car'==$toyName) {
$toy = new NyCar();
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter();
}
如果纽约的Tory有新的改动,我们需要在这里添加它。
2) 阅读链接后,在实际找到更好的解决方案之前,它使用了以下代码:
class NySimpleFactory {
public function createToy($toyName) {
$toy = null;
if ('car'==$toyName) {
$toy = new NyCar();
} else if ('helicopter'==$toyName) {
$toy = new NyHelicopter();
}
return $toy;
}
}
class NyToysFactory {
public $simpleFactory;
public function __construct(SimpleFactory $simpleFactory) {
$this->simpleFactory = $simpleFactory;
}
public function produceToy($toyName) {
$toy = null;
$toy = $this->simpleFactory->createToy($toyName);
$toy->prepare();
$toy->package();
$toy->label();
return $toy;
}
}
然后它说,
开发人员很快完成了新代码并将其交给美国工厂。两周后,开发人员办公室里的电话开始响起,因为纽约工厂正在生产问题。原来,由于工作人员不想进行包装和标签工作,遥远分支的开发人员修改了NyToysFactory类的produceToy()方法,删除了它的label()和package()函数。
看起来简单工厂在这种情况下行不通。我们不希望美国的分支机构能够修改produceToy()函数。ProduceToy()应该由一组标准程序组成,分支机构只负责创建特定地点的玩具。如果他们能够创建一个抽象类呢?他们创建的抽象类将有一个具体的produceToy()方法,该方法将实现所有分支机构都必须遵循的一组标准操作程序。在produceToy()内部,它调用自己的抽象方法createToy()来获取一个玩具类。这样,createToy()就能够封装对象的创建,并且由于它是抽象的,它将对象的创建委托给其子类。
问题是:a)什么意思是将其移交给美国工厂?b)或者我们不希望美国的分支机构能够修改produceToy()函数。如果他们仍然可以修改produceToy函数,那么这有什么区别吗?我只是不明白为什么简单工厂在以下示例中不好。
无需阅读此链接中的抽象工厂