抽象工厂模式

来源:互联网 发布:安卓锁屏可以录像软件 编辑:程序博客网 时间:2024/06/06 04:57

描述

提供一个创建一系列相关或相互依赖的对象的接口,而不需要指定具体的类

使用场景

  • 一个系统要独立于他的产品的创建、组合和表示时
  • 一个系统要由多个产品系列中的一个配置时
  • 需要强调一系列相关产品的对象设计 以便进行联合使用时

结构

这里写图片描述

实现

  • 基于工厂方法模式实现,定义创建一系列产品工厂方法,在工厂子类中实现该方法
  • 基于原型模式实现,避免新产品系列添加时,创建工厂子类

代码示例

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);
0 0
原创粉丝点击