我正在阅读工厂设计模式,这个模式有三种形式:简单工厂、工厂方法和抽象工厂。
据我所知,简单的工厂不是一种设计模式,它只是一种将对象创建代码与if/switch语句结合在一起封装的类型,或者在类不存在的情况下为类直接加载异常!
当我试图转移到工厂方法时,我找不到足够清楚的例子来推迟简单工厂的操作。
你们能给出一个例子来解释工厂方法以及它是如何从简单工厂推迟的吗?
谢谢。
发布于 2017-03-13 09:18:21
简单工厂
一个使用不同方法(或使用switch)的简单类,该类完全由创建逻辑实现。在PHP中,它可以如下所示:
class AnimalFactory
{
public function CreateAnimal($type)
{
if ($type == 'Dog') {
return new Dog();
} else {
return new Cat();
}
}
}如果明天您将有一个新的动物支持,您将不得不更改这个类的实现。这里没有子类--这个类知道创建Animal的所有知识。
工厂方法
当您有一个类对Animal进行一些处理,但还不知道如何创建或创建哪个Animal时,您使用的是什么,因此希望有子类来决定这一点。因此,我们创建了一个工厂方法,傻瓜可以覆盖。
abstract Class MyAnimalProcess
{
abstract function CreateAnimal();
public function Process()
{
$animal = $this->CreateAnimal();
...
...
}
}
class DogProcess extends MyAnimalProcess
{
function CreateAnimal()
{
return new Dog();
}
}因此,这里可以有和抽象类来处理Animal,但是让它的子类决定它将是哪一个Animal。
抽象工厂
将工厂方法向前推进一步,并将创建委托给另一个类--“工厂”类。
所以它使用组合而不是继承。
abstract class AnimalFactory
{
public abstract function CreatePet();
public abstract function CreateWildAnimal();
}
class DogAnimalFactory extends AnimalFactory
{
public function CreatePet()
{
return new Dog();
}
public function CreateWildAnimal()
{
return new AfricanWildDog();
}
}
class CatAnimalFactory extends AnimalFactory
{
public function CreatePet()
{
return new Cat();
}
public function CreateWildAnimal()
{
return new Tiger();
}
}
class MyAnimalProcess
{
function __construct($animalFactory) {
$this->factory = $animalFactory;
}
public function ProcessPet()
{
$animal = $this->factory->CreatePet();
...
...
}
public function ProcessWild()
{
$animal = $this->factory->CreateWild();
...
...
}
}发布于 2017-03-14 08:06:06
也许这会有帮助,让它更清楚,
摘要工厂是工厂方法的集合。
现实生活中的例子:
工厂法 -塑料制品/模具
抽象工厂卡厂
https://stackoverflow.com/questions/42752390
复制相似问题