PHP抽象工厂模式Abstract Factory Pattern优点与实现方式

 更新时间:2023年03月27日 09:40:51   作者:php_gl12345678  
这篇文章主要介绍了PHP抽象工厂模式Abstract Factory Pattern优点与实现方式,抽象工厂模式是一种创建型模式,它提供了一种创建一系列相关或相互依赖对象的最佳方式

抽象工厂模式Abstract Factory Pattern是什么

抽象工厂模式是一种创建型模式,它提供了一种创建一系列相关或相互依赖对象的最佳方式。在抽象工厂模式中,我们定义一个抽象工厂接口,由具体的工厂类来实现该接口,创建一系列相关的对象。

抽象工厂模式的优点

  • 抽象工厂模式可以帮助我们实现松耦合,客户端代码无需知道实际创建的对象,只需知道抽象工厂即可;
  • 抽象工厂模式可以帮助我们封装变化,客户端代码无需关心具体对象的创建过程,只需关心抽象工厂即可;
  • 抽象工厂模式可以帮助我们实现单一职责原则,一个类只负责一个职责,由工厂类负责创建对象。

抽象工厂模式的实现

在 PHP 中,我们可以使用以下方式来实现抽象工厂模式:

1. 定义抽象产品类

<?php
// 定义抽象产品类(汽车)
abstract class Car
{
    protected $brand;
    protected $type;
    public function __construct($brand, $type)
    {
        $this->brand = $brand;
        $this->type = $type;
    }
    abstract public function run();
}
// 定义抽象产品类(手机)
abstract class Phone
{
    protected $brand;
    protected $model;
    public function __construct($brand, $model)
    {
        $this->brand = $brand;
        $this->model = $model;
    }
    abstract public function call();
}

2. 定义具体产品类

<?php
// 定义具体产品类(奔驰汽车)
class BenzCar extends Car
{
    public function run()
    {
        echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
    }
}
// 定义具体产品类(宝马汽车)
class BmwCar extends Car
{
    public function run()
    {
        echo "{$this->brand} {$this->type} is running..." . PHP_EOL;
    }
}
// 定义具体产品类(苹果手机)
class ApplePhone extends Phone
{
    public function call()
    {
        echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
    }
}
// 定义具体产品类(华为手机)
class HuaweiPhone extends Phone
{
    public function call()
    {
        echo "{$this->brand} {$this->model} is calling..." . PHP_EOL;
    }
}

3. 定义抽象工厂类

<?php
// 定义抽象工厂类
abstract class AbstractFactory
{
    abstract public function createCar($type);
    abstract public function createPhone($model);
}

4. 定义具体工厂类

<?php
// 定义具体工厂类(德国工厂)
class GermanFactory extends AbstractFactory
{
    public function createCar($type)
    {
        switch ($type) {
            case 'Benz':
                return new BenzCar('Benz', 'C200L');
            case 'Bmw':
                return new BmwCar('Bmw', 'X3');
            default:
                throw new Exception('Undefined car type.');
        }
    }
    public function createPhone($model)
    {
        switch ($model) {
            case 'iPhone':
                return new ApplePhone('Apple', 'iPhone 11');
            case 'Huawei':
                return new HuaweiPhone('Huawei', 'Mate 30');
            default:
                throw new Exception('Undefined phone model.');
        }
    }
}
// 定义具体工厂类(中国工厂)
class ChineseFactory extends AbstractFactory
{
    public function createCar($type)
    {
        switch ($type) {
            case 'Benz':
                return new BenzCar('奔驰', 'C200L');
            case 'Bmw':
                return new BmwCar('宝马', 'X3');
            default:
                throw new Exception('Undefined car type.');
        }
    }
    public function createPhone($model)
    {
        switch ($model) {
            case 'iPhone':
                return new ApplePhone('苹果', 'iPhone 11');
            case 'Huawei':
                return new HuaweiPhone('华为', 'Mate 30');
            default:
                throw new Exception('Undefined phone model.');
        }
    }
}

5. 使用

<?php
// 使用德国工厂
$germanFactory = new GermanFactory();
$car1 = $germanFactory->createCar('Benz');
$car1->run(); // output: Benz C200L is running...
$phone1 = $germanFactory->createPhone('iPhone');
$phone1->call(); // output: Apple iPhone 11 is calling...
// 使用中国工厂
$chineseFactory = new ChineseFactory();
$car2 = $chineseFactory->createCar('Bmw');
$car2->run(); // output: 宝马 X3 is running...
$phone2 = $chineseFactory->createPhone('Huawei');
$phone2->call(); // output: 华为 Mate 30 is calling...

总结

抽象工厂模式是一种非常常见的创建型模式,它可以帮助我们封装变化,实现松耦合,同时遵循单一职责原则。在实际开发中,我们可以根据具体的需求,选择不同的抽象工厂模式来实现一系列相关对象的创建。

到此这篇关于PHP抽象工厂模式Abstract Factory Pattern优点与实现方式的文章就介绍到这了,更多相关PHP抽象工厂模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP写API输出的时用echo的原因详解

    PHP写API输出的时用echo的原因详解

    在本篇文章里小编给大家分享了关于PHP写API输出的时用echo的原因和相关知识点,需要的朋友们参考下。
    2019-04-04
  • 用PHP程序实现支持页面后退的两种方法

    用PHP程序实现支持页面后退的两种方法

    在开发过程中,往往因为表单出错而返回页面的时候填写的信息都不见了,为了支持页面回跳,可以通过两种方法实现。
    2008-06-06
  • PHPThumb PHP 图片缩略图库

    PHPThumb PHP 图片缩略图库

    刚上网搜索了一下,跟这个同名的还有另一个,似乎也挺不错的,这个类库是github.com上的一个开源项目:PHPThumb
    2012-03-03
  • PHP Session条件竞争超详细讲解

    PHP Session条件竞争超详细讲解

    这篇文章主要介绍了PHP Session条件竞争,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • php使用curl简单抓取远程url的方法

    php使用curl简单抓取远程url的方法

    这篇文章主要介绍了php使用curl简单抓取远程url的方法,涉及php操作curl的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • php写入txt乱码的解决方法

    php写入txt乱码的解决方法

    在本篇文章里小编给大家分享的是关于php写入txt乱码的知识点以及解决方法,有需要的朋友们参考下。
    2019-09-09
  • php中curl和file_get_content的区别

    php中curl和file_get_content的区别

    抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求也不大,所以没有学习使用curl
    2014-05-05
  • php实现的表单验证类完整示例

    php实现的表单验证类完整示例

    这篇文章主要介绍了php实现的表单验证类,结合完整实例形式分析了php封装的表单相关的正则验证、字符串转换等相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • PHP Socket网络操作类定义与用法示例

    PHP Socket网络操作类定义与用法示例

    这篇文章主要介绍了PHP Socket网络操作类定义与用法,结合实例形式分析了php socket网络操作类的定义及结合ajax发送查询请求等相关使用技巧,需要的朋友可以参考下
    2017-08-08
  • PHP封装的字符串加密解密函数

    PHP封装的字符串加密解密函数

    这篇文章主要给大家汇总介绍了PHP封装的字符串加密解密函数以及使用方法,非常的简单实用,有需要的小伙伴可以参考下
    2015-12-12

最新评论