设计模式入门系列
在之前的项目中,如果需要创建某一类型的类的实例,我通常会专门写一个用来创建该类的类。以下面的例子为例,为了创建BMW和Benz的实例,我通常会建一个类似于CarFactory的类,通过传入一个参数在该类的接口(比如说getInstance)中返回想要创建的类。
这种创建类的方式叫做简单工厂模式。
这么做的一个问题是在getInstance中需要加入很多的判断,每增加一种新的类型就需要在switch case的代码中增加一种类型,这在面向对象编程中是不被推荐的;另外一种情况就是如果一个参数不够用了,需要增加一些新的参数来判断,这就会导致创建该类的接口变得越来越复杂。
在我理解的工厂方法模式中,工厂相当于是对要创建的类的层次结构的抽象。工厂类必须要与其创建的类具有相同的层次结构,每一个类的创建都可以通过一个在工厂类层次结构中与其相同位置的工厂来创建。这样既保留了对原来类结构的描述,又实现了最大程度上的解耦。
<?php
interface car
{
public function drive();
}
class BMW implements car
{
public function drive()
{
echo "This is BMW";
}
}
class Benz implements car
{
public function drive()
{
echo "This is Benz";
}
}
interface Factory
{
public function createCar();
}
class BMWFactory implements Factory
{
public function createCar()
{
return new BMW();
}
}
class BenzFactory
{
public function createCar()
{
return new Benz();
}
}