工厂模式就是负责将大量有共同接口的类实例,而不必事先知道要实例化哪一个类的模式。工厂模式一般分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。从模式性质来说,工厂模式属于创建型模式。
工厂方法定义
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Construct)模式或者多态工厂模式(Polymorphic Factory),在工厂模式中,父类负责定义创建对象的接口,而真正实现创建对象的任务交给子类去实现。这样作的目的是将创建对象的工作延迟到子类中去完成,由子类决定生成哪个具体的对象。
相对模于简单工厂模式来说,工厂方法模式解决了简单工厂模式的缺点-违反开放-封闭原则,将添加更多的产品种类以扩展方式就能实现,而不必去修改工厂类或者产品类。
<?php
// Factory Method
interface IAnimal {
function Eat();
}
class Dog implements IAnimal {
public function Feed() {
echo "Dog Eat!\n";
echo "<br/>";
}
}
class Cat implements IAnimal {
public function Eat() {
echo "Cat Eat!";
echo "<br/>";
}
}
interface Feeder {
function Feed();
}
class DogFeeder implements Feeder {
public function Feed() {
return new Dog();
}
}
class CatFeeder implements Feeder {
public function Feed() {
return new Cat();
}
}
// Test
$DogFeeder = new DogFeeder();
$Dog = $DogFeeder->Feed();
$Dog->Eat();
$CatFeeder = new CatFeeder();
$Cat = $CatFeeder->Feed();
$Cat->Eat();
?>
上面代码中,我们将喂养动物的任务交给对应喂养动物的子类DogFeeder/CatFeeder去执行,不是在Feeder类中去写逻辑判断该喂养哪一动物。
优点
我们要另外加一新的品种动物的喂养,只需要新增一个动物类以及动物喂养类,然后在主逻辑代码里直接使用对应的动物喂养类调用喂养该动物就好,而不必去修改现在的代码,在遵循开放-封闭原则基础上做到很好的对现有系统的扩展。
缺点
我觉得没什么缺点,唯一缺点就是新增喂养动物需要新写动物类以及具体的动物喂养类,但是这个是必须的呀。
应用场景
- 类不知道自己要创建哪个对象
- 类由它的子类类确定创建哪个对象
- 类将创建对象的职责交个它的子类去实现