PHP工厂模式Factory Pattern的实现及特点

作者:php_gl12345678 时间:2023-05-25 05:19:24 

工厂模式(Factory Pattern)是什么

工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会向客户端暴露创建逻辑,而是使用一个共同的接口来指向新创建的对象。

工厂模式的优点

  • 工厂模式可以帮助我们实现松耦合,它将客户端代码与实际创建对象的代码分离开来;

  • 工厂模式可以帮助我们封装变化,客户端代码无需知道实际创建的对象,只需知道工厂即可;

  • 工厂模式可以帮助我们实现单一职责原则,一个类只负责一个职责,由工厂类负责创建对象。

工厂模式的实现

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

1. 简单工厂模式

简单工厂模式是一种将创建逻辑封装在一个类中的工厂模式。在简单工厂模式中,我们使用一个工厂类来创建所有的对象,根据传入的参数不同来返回不同的对象实例。

<?php
// 定义接口
interface Car
{
   public function run();
}
// 实现接口
class Benz implements Car
{
   public function run()
   {
       echo 'Benz is running...';
   }
}
// 实现接口
class Bmw implements Car
{
   public function run()
   {
       echo 'Bmw is running...';
   }
}
// 工厂类
class CarFactory
{
   public static function createCar($type)
   {
       switch ($type) {
           case 'Benz':
               return new Benz();
           case 'Bmw':
               return new Bmw();
           default:
               throw new Exception('Undefined car type.');
       }
   }
}
// 使用
$car1 = CarFactory::createCar('Benz');
$car1->run(); // output: Benz is running...
$car2 = CarFactory::createCar('Bmw');
$car2->run(); // output: Bmw is running...

2. 工厂方法模式

工厂方法模式是一种将对象的创建委托给具体的工厂类来完成的工厂模式。在工厂方法模式中,我们定义一个创建对象的接口,由子类来决定实例化哪个类。

<?php
// 定义接口
interface Car
{
   public function run();
}
// 实现接口
class Benz implements Car
{
   public function run()
   {
       echo 'Benz is running...';
   }
}
// 实现接口
class Bmw implements Car
{
   public function run()
   {
       echo 'Bmw is running...';
   }
}
// 定义工厂接口
interface CarFactory
{
   public function createCar();
}
// 实现工厂接口
class BenzFactory implements CarFactory
{
   public function createCar()
   {
       return new Benz();
   }
}
// 实现工厂接口
class BmwFactory implements CarFactory
{
   public function createCar()
   {
       return new Bmw();
   }
}
// 使用
$benzFactory = new BenzFactory();
$car1 = $benzFactory->createCar();
$car1->run(); // output: Benz is running...
$bmwFactory = new BmwFactory();
$car2 = $bmwFactory->createCar();
$car2->run(); // output: Bmw is running...

3. 抽象工厂模式

抽象工厂模式是一种将多个对象的创建委托给具体的工厂类来完成的工厂模式。在抽象工厂模式中,我们定义一个抽象工厂接口,由具体的工厂类来实现该接口,创建多个相关的对象。

<?php
// 定义接口
interface Car
{
   public function run();
}
// 实现接口
class Benz implements Car
{
   public function run()
   {
       echo 'Benz is running...';
   }
}
// 实现接口
class Bmw implements Car
{
   public function run()
   {
       echo 'Bmw is running...';
   }
}
// 定义抽象工厂接口
interface CarFactory
{
   public function createBenz();
   public function createBmw();
}
// 实现抽象工厂接口
class Factory implements CarFactory
{
   public function createBenz()
   {
       return new Benz();
   }
   public function createBmw()
   {
       return new Bmw();
   }
}
// 使用
$factory = new Factory();
$car1 = $factory->createBenz();
$car1->run(); // output: Benz is running...
$car2 = $factory->createBmw();
$car2->run(); // output: Bmw is running...

总结

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

来源:https://blog.csdn.net/weixin_39934453/article/details/129717050

标签:PHP,工厂模式,Factory,Pattern
0
投稿

猜你喜欢

  • 对python调用RPC接口的实例详解

    2022-12-30 00:09:20
  • Git Submodule使用完整教程(小结)

    2022-06-29 21:01:06
  • 小谈用户身体语言的阅读经验

    2009-10-19 20:52:00
  • PyTorch小功能之TensorDataset解读

    2023-02-26 06:06:27
  • Python机器学习之逻辑回归

    2023-11-18 14:19:02
  • MySQL选错索引的原因以及解决方案

    2024-01-19 21:34:34
  • JS关于 replace 取值、替换第几个匹配项问题小结

    2024-04-25 13:11:05
  • 如何对MySQL数据库表进行锁定

    2009-02-10 10:39:00
  • Python字符串逆序输出的实例讲解

    2023-04-21 22:59:46
  • python中count函数知识点浅析

    2023-05-21 18:41:30
  • vue-router路由懒加载和权限控制详解

    2024-04-27 15:51:24
  • Python内置函数 next的具体使用方法

    2023-09-30 18:42:28
  • MySql数据库单表查询与多表连接查询效率对比

    2024-01-26 12:28:05
  • Git建立本地仓库并上传到Gitee的详细步骤

    2023-03-06 20:45:21
  • 如何通过命令行进入python

    2022-10-28 22:12:56
  • js图片随机显示技巧

    2007-08-19 20:20:00
  • python实现自动整理文件

    2021-03-04 14:15:46
  • python同时替换多个字符串方法示例

    2021-11-25 00:37:54
  • Python3网络爬虫中的requests高级用法详解

    2023-02-05 16:54:52
  • SQL Server创建索引教程

    2010-07-02 21:09:00
  • asp之家 网络编程 m.aspxhome.com