您的位置:首页 > 其它

工厂方法模式

2016-01-03 17:47 519 查看

描述

别名虚拟构造器,定义一个用于创建对象的接口,由子类去决定实例化哪个类,使得一个类的实例化延迟到其子类。

使用场景

当一个类不知道它所必须创建的对象的类的时候

当一个类希望由它的子类来指定所创建的对象的时候

结构



实现

工厂类可以设计为抽象类,但不提供工厂方法的具体实现

工厂类可以设计为具体类,同时提供工厂方法的默认实现,使得其子类可以重新定义工厂方法的具体实现

参数化工厂方法

尽量避免创建工厂子类(结合模板、反射等语言特性)

代码示例

class Document {
public function __construct() {
echo "Document初始化...\n";
}
}

class MyDocument extends Document {
public function __construct() {
echo "MyDocument初始化...\n";
}

}

class OtherDocument extends Document {
public function __construct() {
echo "OtherDocument初始化...\n";
}
}

class Application {

public function createDocument() {
return $this->getDocument();
}
protected function getDocument() {
echo "获取文档对象....\n";
}
}

class MyApplication extends Application {

protected function getDocument() {
return new MyDocument();
}
}

class OtherApplication extends Application {
protected function getDocument() {
return new OtherDocument();
}
}

//利用反射避免工厂创建子类
class ReflectDocument extends Document {
public function __construct() {
echo "ReflectDocument初始化...\n";
}

}

class ReflectApplication {
public function createDocument($className = '') {
return $this->getDocument($className);
}

public function getDocument($className = '') {
try {
$class = new ReflectionClass($className);
$instance = $class->newInstanceArgs();
return $instance;
} catch(Exception $e) {
var_dump($e->getMessage());
}
}
}

$myApplication = new MyApplication();
$document = $myApplication->createDocument();
var_dump($document);

$otherApplication = new OtherApplication();
$document = $otherApplication->createDocument();
var_dump($document);

$refletApplication = new ReflectApplication();
$document = $refletApplication->createDocument("ReflectDocument");
var_dump($document);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: