抽象工厂模式

描述

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

使用场景

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

结构

这里写图片描述

实现

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

代码示例

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值