网络编程
位置:首页>> 网络编程>> php编程>> PHP工厂模式Factory Pattern的实现及特点

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

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

标签:PHP,工厂模式,Factory,Pattern

工厂模式(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

0
投稿

猜你喜欢

  • 其实这个话题已经在侧面写了好几篇深刻反思,用我自己几年工作实践的体会来看,性格决定了将来的发展。某些特质虽然可以掩饰,但在这之上必然不可能有
  • 相信用过Gmail的人都知道Gmail有一个草稿自动保存的功能,每过一段时间,Gmail都会自动保存邮件草稿,这样在一些突 * 况下就能快速地
  • 这只是个asp小技巧类的东西,它虽然适合在每个不同文件名里调用这个函数,但是也是有前提的,下面让我们来仔细看看其中的原委。  &n
  • buffer:下载数据缓冲区,以字节为单位,缺省依赖操作系统 consistent:下载期间所涉及的数据保持read only,缺省为n d
  • 以前的Sony Ericsson牌DVD影碟机坏掉了,上周到沃尔玛买了个philips的回来,于是又淘了一些DVD回来看。在使用遥控的时候忽
  • 树型结构在我们应用程序中还是很常见的,比如文件目录,BBS,权限设置,部门设置等。这些数据信息都采用层次型结构,而在我们现在的关系型数据库中
  • MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。标准的SQL模式匹
  • replace 方法返回根据正则表达式进行文字替换后的字符串的复制。stringObj.replace(rgExp, replaceText
  • 原来工作中曾经碰到过UL列表里一些异常的表现,加上昨天看到了http://bbs.blueidea.com/thread-2984871-1
  • //1、运行到C盘根目录 //2、输入:SET ORACLE_SID = 你的SID名称 3、输入:sqlplus/nolog 4、输入:c
  • 说到Javascript的类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。无参数类继承的问题先看一段示例代码,实现B继承于
  • 数据库优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解才行。尽管对系统或应用系统的了解不多的情况下优化效果还不错,但是如果想优化的
  • 在面向对象的编程中,很多语言都支持函数重载,能根据函数传递的不同个数、类型的参数来做不同的操作,JS对它却不支持,需要我们额外做些小动作。在
  • 通常我们在制作上图的时候,会分别给四个div加上不同的css属性,来实现中间间隔。但我们更希望的是不需要对html标签做标识,直接能通过cs
  • 其实SQLServer提供了一个sp_spaceused的系统存储过程可以实现该功能,下面就是调用的SQL:  代码如下:crea
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容
  • 前几天帮人调试一个ASP+SQL2000+IIS5.1/6.0的网站程序,调试过程中遇到的问题如下:一、 SQLServer登录 原先存在备
  • 两列布局的定宽自适应已经详解了,三列浮动中有两列定宽一列自适应的也详解了,那么该说说三列浮动中两列自适应一列定宽的布局了。中间定宽,左右两侧
  • 当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度。笔者做了一个简单的尝试,1亿条数据,分100张表。具体实现过程如下。首先
  • sql server 全文检索有两种搜索方式,一种是contains,另一种是freetext。前者是包含,类似于 like '%关
手机版 网络编程 asp之家 www.aspxhome.com