描述
提供一个创建一系列相关或相互依赖的对象的接口,而不需要指定具体的类
使用场景
- 一个系统要独立于他的产品的创建、组合和表示时
- 一个系统要由多个产品系列中的一个配置时
- 需要强调一系列相关产品的对象设计 以便进行联合使用时
结构
实现
- 基于工厂方法模式实现,定义创建一系列产品工厂方法,在工厂子类中实现该方法
- 基于原型模式实现,避免新产品系列添加时,创建工厂子类
代码示例
class Window {
}
class PMWindow extends Window {
}
class MotlfWindow extends Window {
}
class extensionWindow extends Window {
}
class ScrollBar {
}
class PMScrollBar extends ScrollBar {
}
class MotlfScrollBar extends ScrollBar {
}
class extensionScrollBar extends ScrollBar {
}
class Widget {
public function createWidget() {
$this->window = $this->createWindow();
$this->scrollBar = $this->createScrollBar();
}
public function createWindow() {
}
public function createScrollBar() {
}
}
class PMWidget extends Widget {
public function createWindow() {
return new PMWindow();
}
public function createScrollBar() {
return new PMScrollBar();
}
}
class MotlfWidget extends Widget {
public function createWindow() {
return new MotlfWindow();
}
public function createScrollBar() {
return new MotlfScrollBar();
}
}
//可扩展的工厂
class extensionWidget extends Widget {
public function createWidget($window, $scrollBar) {
$this->window = $this->getPartObj($window);
$this->scrollBar = $this->getPartObj($scrollBar);
}
public function getPartObj($className = '') {
try {
//在这里可以保存好创建好的对象,第二次调用时可以复制,也就是基于原型模型的实现方式
$class = new ReflectionClass($className);
$instance = $class->newInstanceArgs();
return $instance;
} catch(Exception $e) {
var_dump($e->getMessage());
}
}
}
$widget = new PMWidget();
$widget->createWidget();
var_dump($widget);
$widget = new MotlfWidget();
$widget->createWidget();
var_dump($widget);
//扩展后的抽象工厂
$widget = new extensionWidget();
$widget->createWidget('extensionWindow','extensionScrollBar');
var_dump($widget);