在设计模式中,工厂模式有三种,即:简单工厂模式、工厂方法模式 [ 附:PHP设计模式-工厂方法模式 ] 和 抽象工厂模式 [附:PHP设计模式-抽象工厂模式 ] 。那么,为什么取名叫叫工厂呢?我们都知道,工厂是生产产品的地方。给这些设计模式取名工厂的意思也就是告诉大家,这三种模式其实就是为了生产产品(即创建对象)。而且,这三者之中,以简单工厂最为简单(有点废话了)。
那么,什么是简单工厂呢?简单工厂就是,告诉工厂我要生产的产品的名字,你给我生产出相应的产品出来(即告诉对象名,创建对象)。举个例子,有一个玩具工厂,有很多车间,可以生产狗,熊,猫三种玩具。那么,我们有如下定位:
class DogToy
{
}
class CatToy {
}
class BearToy
{
}
当我们需要生产一个猫玩具的时候,可以用new CatToy(), 生成狗玩具的时候可以用new DogToy(), ...。这样,看起来,好像也没有什么问题。但,如果我是公司的领导,我就得先找到生产狗玩具的车间,告诉他们,给我生产狗玩具。如果我要生产熊和猫也一样。那这样是不是很累?那领导说话了,不行,这种事怎么能让我去干?我还有好多事儿要做呢。具体该如何操作,还是让车间主管去处理吧。于是任命了一个车间主管。而车间主管的职责就是随时候命,需要生产什么你就去处理。
class FactoryManager
{
public function make()
{
}
}
领导告诉你要生产什么,只要告诉主管要生产的玩具的名字就可以了,其它该怎么生产由主管去联系车间负责生产。
class FactoryManager
{
//你让我生产什么,告诉我玩具的名字就可以了
public static function make($toyName)
{
switch ($toyName) {
case "cat":
return new CatToy();
case "bear":
return new BearToy();
case "dog":
return new DogToy();
}
}
}
如果领导告诉我们,需要生产驴玩具,但我们生产不了这种玩具。那得告诉领导吧。所以我们需要存一份我们能生成的列表。另外,我们需要稍微整理一下。因为要生产的玩具名称和类名很有规律(玩具名首字母大写后加一个Toy就可以了)。于是有如下代码:
class DogToy
{
}
class CatToy
{
}
class BearToy
{
}
class FactoryManager
{
//指定我们工厂可以生产的玩具类型
public static $allowToyName = array(
"bear", "cat", "dog"
);
//你让我生产什么,告诉我玩具的名字就可以了
public static function make($toyName)
{
//检查这种玩具是否能生产
$toyName = strtolower($toyName);
if (!in_array($toyName, self::$allowToyName)) {
throw new Exception("没法生产这种玩具");
}
//生产玩具
$className = ucfirst($toyName).'Toy';
return new $className();
}
}
从上面代码可以看出来。所有的创建对象的工作,都交给了工厂的主管来做。它负责每个产品的生产情况。领导不用关心,只关心我要什么产品就可以了---这就是简单工厂模式的好处.而且我们发现,工厂能生产什么样的玩具,这个需要可控。也就是说,对于简单工厂模式来说,它适用于创建的对象类型可能比较少。同时,我们可以看到,这种简单工厂,就是依靠一个创建对象的类里面的一个静态方法来创建需要的对象。因此我们也把简单工厂叫做:静态工厂方法.