在大的应用中如果每需要得到一个对象都要自己去new,程序的业务逻辑就很混乱,统一由工厂创建,便于管理和扩展。工厂模式主要针对的多态,如果该类可能有很多派生,使用工厂模式比较方便。工厂模式一般可以分为三类:简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式:
zf代码实例:
class Zend_Db
{
//更具传人的apdater参数觉得实例化相应的db
public static function factory($adapter, $config = array())
{
if ($config instanceof Zend_Config) {
$config = $config->toArray();
}
/*
* Convert Zend_Config argument to plain string
* adapter name and separate config object.
*/
if ($adapter instanceof Zend_Config) {
if (isset($adapter->params)) {
$config = $adapter->params->toArray();
}
if (isset($adapter->adapter)) {
$adapter = (string) $adapter->adapter;
} else {
$adapter = null;
}
}
......
return $dbAdapter;
}
}
客户端可以通过传人参数向简单工厂发出要实例化那个产品实例的命令,一个工厂可以创造出多种产品。但它的缺点是客户端需要知道工厂内部的少量实现细节(具体的参数),另外当要增加新的产品的时候,需要改变工厂类中的代码,违反了开闭原则。
工厂方法模式:
工厂方法模式为了解决简单工厂模式所遇到的缺点,把实例化产品的方法延迟的子类中。父类或者是接口定义了创建产品的方法,但是它并不知道具体的实现,具体的实现在它的下一层类中,调用哪个具体的工厂内交给了客户端,这样的好处是如果需要添加新产品不用修改父类的代码,直接扩展相应产品对于的工厂类即可。
工厂方法的缺点也非常清楚,需要写太多的工厂类。
工厂方法模式在php框架中很少见,在java的spring中倒是用的很多。
抽象工厂模式:
在实际中,一个工厂有可能不只生产一种产品,抽象工厂模式对于这种情况,每个工厂中有多个创建产品的方法,在应用中一般情况下这些产品类应该属于同一系列。