我正在阅读工厂设计模式,这个模式有3种形式,简单工厂,工厂方法和抽象工厂。
我的理解是,简单的工厂不是设计模式,它只是一种将对象创建代码与if / switch语句一起封装的类型,或者如果类不存在则直接加载类的异常!。
当我尝试转向工厂方法时,我找不到一个足够清晰的例子来推迟简单工厂。
你们能举个例子来解释工厂方法以及它如何从简单的工厂推迟?
谢谢。
答案 0 :(得分:2)
简单工厂
使用创建逻辑完全实现的具有不同方法的简单类(或具有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();
...
...
}
}
答案 1 :(得分:0)
也许这会有所帮助,使其更清楚,
抽象工厂是工厂方法的集合。
现实生活中的例子:
Factory Method - 橡皮泥/模具
Abstract Factory - 卡片工厂