工厂方法设计模式-PHP
我在读关于工厂设计模式的书,这个模式有三种形式,简单工厂,工厂方法和抽象工厂 据我所知,简单工厂不是一种设计模式,它只是一种封装对象创建代码的类型,与if/switch语句结合使用,或者直接加载类(如果类不存在的话) 当我尝试转移到工厂方法时,我找不到一个足够清晰的例子来将它从简单的工厂推迟 你们能举个例子来解释工厂方法,以及它是如何从简单工厂中分离出来的吗工厂方法设计模式-PHP,php,design-patterns,factory,Php,Design Patterns,Factory,我在读关于工厂设计模式的书,这个模式有三种形式,简单工厂,工厂方法和抽象工厂 据我所知,简单工厂不是一种设计模式,它只是一种封装对象创建代码的类型,与if/switch语句结合使用,或者直接加载类(如果类不存在的话) 当我尝试转移到工厂方法时,我找不到一个足够清晰的例子来将它从简单的工厂推迟 你们能举个例子来解释工厂方法,以及它是如何从简单工厂中分离出来的吗 多谢各位 简单工厂 一个具有不同方法的简单类(或具有开关的类),完全使用创建逻辑实现。在PHP中,它可以如下所示: class Anima
多谢各位 简单工厂 一个具有不同方法的简单类(或具有
开关的类),完全使用创建逻辑实现。在PHP中,它可以如下所示:
class AnimalFactory
{
public function CreateAnimal($type)
{
if ($type == 'Dog') {
return new Dog();
} else {
return new Cat();
}
}
}
如果tommorow需要支持一个新的动物,则必须更改该类的实现。
这里没有子类-这个类知道关于Animal
创建的一切
工厂方法
当您有一个类对Animal
进行某些处理,但还不知道如何创建或创建哪个Animal
时,您将使用它,因此希望有子类来确定这一点。所以我们创建了一个工厂方法,sucblasses可以覆盖它
abstract Class MyAnimalProcess
{
abstract function CreateAnimal();
public function Process()
{
$animal = $this->CreateAnimal();
...
...
}
}
class DogProcess extends MyAnimalProcess
{
function CreateAnimal()
{
return new Dog();
}
}
因此,这里您可以使用一个抽象类来处理动物
,但是让它的子类来确定它将是哪个动物
抽象工厂
将工厂方法向前推进一步,并将创建委托给另一个类——“工厂”类。
所以它使用组合而不是继承
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();
...
...
}
}
简单工厂
一个具有不同方法的简单类(或具有开关的类),完全使用创建逻辑实现。在PHP中,它可以如下所示:
class AnimalFactory
{
public function CreateAnimal($type)
{
if ($type == 'Dog') {
return new Dog();
} else {
return new Cat();
}
}
}
如果tommorow需要支持一个新的动物,则必须更改该类的实现。
这里没有子类-这个类知道关于Animal
创建的一切
工厂方法
当您有一个类对Animal
进行某些处理,但还不知道如何创建或创建哪个Animal
时,您将使用它,因此希望有子类来确定这一点。所以我们创建了一个工厂方法,sucblasses可以覆盖它
abstract Class MyAnimalProcess
{
abstract function CreateAnimal();
public function Process()
{
$animal = $this->CreateAnimal();
...
...
}
}
class DogProcess extends MyAnimalProcess
{
function CreateAnimal()
{
return new Dog();
}
}
因此,这里您可以使用一个抽象类来处理动物
,但是让它的子类来确定它将是哪个动物
抽象工厂
将工厂方法向前推进一步,并将创建委托给另一个类——“工厂”类。
所以它使用组合而不是继承
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();
...
...
}
}
也许这会有帮助,让事情变得更清楚,
抽象工厂是工厂方法的集合
现实生活中的例子:
-橡皮泥/霉菌
-卡片工厂也许这会有帮助,更清楚地说,
抽象工厂是工厂方法的集合
现实生活中的例子:
-橡皮泥/霉菌
-卡片工厂当您必须检查子类中的类型以创建实例时,特定工厂方法如何有用?当您必须检查子类中的类型以创建实例时,特定工厂方法如何有用?