我正在阅读有关工厂设计模式的文章,该模式有 3 种形式:简单工厂、工厂方法和抽象工厂。
据我了解,简单工厂不是一种设计模式,它只是一种封装对象创建代码的类型,与 if/switch 语句结合使用,或者直接加载类,如果类不存在,则异常!
当我尝试转向工厂方法时,我找不到足够清晰的示例来将其从简单工厂中推迟。
你们能举一个例子来解释工厂方法以及它如何与简单工厂不同吗?
谢谢。
简单工厂
一个具有不同方法(或具有)的简单switch类,完全使用创建逻辑实现。在 PHP 中,它可以如下所示:
class AnimalFactory
{
public function CreateAnimal($type)
{
if ($type == 'Dog') {
return new Dog();
} else {
return new Cat();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果明天您要饲养一种新动物,则必须更改此类的实现。这里没有子类——这个类知道关于Animal创造的一切。
工厂方法
当您有一个类进行一些处理Animal但不知道如何或Animal创建哪些内容时,您会使用它,因此希望有子类来确定这一点。因此,我们创建一个子类可以重写的工厂方法。
abstract Class MyAnimalProcess
{
abstract function CreateAnimal();
public function Process()
{
$animal = $this->CreateAnimal();
...
...
}
}
class DogProcess extends MyAnimalProcess
{
function CreateAnimal()
{
return new Dog();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在这里您可以拥有一个抽象类,它可以对 an 执行某些操作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();
...
...
}
}
Run Code Online (Sandbox Code Playgroud)