,,PHP设计模式之工厂模式(Factory Pattern)的讲解

,,PHP设计模式之工厂模式(Factory Pattern)的讲解

今天,边肖将与你分享一个关于PHP设计模式的工厂模式的解释。边肖觉得内容挺好的,现在分享给大家,很有参考价值。有需要的朋友应该跟着边肖去看看。

在面向对象编程中,工厂模式是我们最常用的实例化对象模式,工厂类是专门用来创建其他对象的类。工厂类在多态编程实践中非常重要。它允许动态的类替换和配置修改,这将使应用程序更加灵活。掌握工厂模式对于Web开发来说至关重要,它将为您的系统带来更大的可伸缩性和最小的修改。

工厂通常用于返回具有相似接口的不同类,工厂的一个常见用途是创建多态提供者。

通常,工厂模式有一个关键构造,即名为factory的静态方法。这个静态方法可以接受任意数量的参数,并且必须返回一个对象。

一个非常贴近生活的例子来告诉你什么是工厂模式

但是工厂模式真的是负担吗?其实不是!他能作为设计模式流传至今一定有原因!但是我们看到的例子只能说明什么是工厂模式,而不能说明工厂模式的优点,所以我们学了之后也不知道为什么要用工厂模式,什么时候用工厂模式!

实际上,工厂模式在我们的现实生活中非常普遍。我举个生活中的例子,你应该能明白工厂模式用在哪里!

麦当劳的人都吃过吧?当我们去点菜的时候,我们可以点一个汉堡,一杯可乐和一份薯条。我们也可以点一杯可乐和一份薯条。点餐后,点餐员会问我们,还要点别的吗?你说不行!然后你的饭会被点,你可以付钱。哎呀,我们发现这是一个构建器模式!

(ps:这确实是突然发现。之前写关于构建器模式的文章时没有想到这个例子)

基本的工厂类:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

水果类{

//对象是从工厂类返回的

}

类FruitFactory {

公共静态函数工厂(){

//返回对象的新实例

返回新水果();

}

}

//给工厂打电话

$ instance=fruit factory:factory();

利用工厂类生产对象:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

班级示例

{

//参数化工厂方法

公共静态函数工厂($type)

{

if (include_once 'Drivers/'。$type。php') {

$classname='Driver_'。$ type

返回新的$ classname

}否则{

引发新异常(“找不到驱动程序”);

}

}

}

//加载MySQL驱动程序

$ MySQL=Example:factory(' MySQL ');

//加载SQLite驱动程序

$ SQLite=Example:factory(' SQLite ');

一个完整的工厂类:

下面的程序定义了一个通用的工厂类,它产生可以保存所有操作的空对象。你可以得到一个实例,所有这些操作都在那个实例中。

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)

/**

*通用工厂类

*该工厂将记住您在其上执行的所有操作,

*并将它们应用于它实例化的对象。

*/

类FruitFactory {

private $history,$class,$ constructor _ args

/**

*创建给定类的工厂。接受要传递给的额外参数

*类构造函数。

*/

function __construct( $class ) {

$ args=func _ get _ args();

$ this-class=$ class;

$ this-constructor _ args=array _ slice($ args,1);

}

function __call( $method,$args ) {

$this-history[]=array(

动作'='呼叫',

method'=$method,

args'=$args

);

}

函数__set( $property,$value ) {

$this-history[]=array(

action'='set ',

property'=$property,

值'=$value

);

}

/**

*创建一个实例并执行在此MagicFactory上完成的所有操作

*/

函数实例(){

#使用反射创建一个新实例,使用$args

$ reflection _ object=new reflection class($ this-class);

$ object=$ reflection _ object-newInstanceArgs($ this-constructor _ args);

#不使用ReflectionClass但不支持变量的替代方法

#构造函数参数的数量。

//$ object=new $ this-class();

#重复所有记忆的操作,应用于新对象。

foreach( $this-history as $item ) {

if(item[' action ']==' call '){

call _ user _ func _ array(array($ object,$item['method']),$ item[' args ']);

}

if(item[' action ']=' set '){

$ object-{ $ item[' property ']}=$ item[' value '];

}

}

#完成

返回$ object

}

}

水果类{

private $name,$ color

公共$价格;

function __construct( $name,$color ) {

$ this-name=$ name;

$ this-color=$ color;

}

函数集名称($name ) {

$ this-name=$ name;

}

函数简介(){

打印“您好,这是一个{$this-name} {$this-sirname},价格是{$this-price}人民币。”;

}

}

#建立工厂

$ Fruit _ factory=new Fruit factory(' Fruit ',' Apple ',' Gonn ');

$ fruit _ factory-set name(' Apple ');

$ fruit _ factory-price=2;

#获取实例

$ apple=$ fruit _ factory-instance();

$ apple-introduce();

工厂模式主要提供创建对象的过渡接口,从而屏蔽和隔离创建对象的具体过程,达到提高灵活性的目的。

工厂模式可以分为三类:

工厂方法模式(简单工厂)

工厂方法(Factory Method)

抽象工厂(抽象工厂)

这三种模式自上而下逐渐抽象,更加通用。

工厂方法模式也叫静态工厂方法模式;从命名可以看出,这种模式一定很简单。它的目的很简单:定义一个创建对象的接口。

工厂方法模式移除了工厂方法模式中工厂方法的静态属性,这样它就可以被子类继承。这样,工厂方法模式中工厂方法的压力就可以被工厂方法模式中不同的工厂子类分担。

工厂方法模式似乎已经完美地打包了对象的创建,因此只有抽象产品角色提供的接口才在客户端程序中处理。我们必须把代码散布到整个工厂吗?不需要。也许你可以考虑在以下情况下使用工厂方法模式:

当客户程序不需要知道要使用的对象的创建过程时。

程序使用的对象可能会改变,或者客户端根本不知道使用哪个特定的对象。

总结

这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。谢谢你的支持。如果你想了解更多,请查看下面的相关链接。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 使用php连接mysql数据库,php连接数据库的方法
  • 使用php连接mysql数据库,php连接数据库的方法,一文详解PHP连接MySQL数据库的三种方式
  • 七种php开发环境搭建工具有哪些,七种php开发环境搭建工具包括
  • 七种php开发环境搭建工具有哪些,七种php开发环境搭建工具包括,七种PHP开发环境搭建工具
  • php高并发三种解决方法,php 高并发解决方案
  • php高并发三种解决方法,php 高并发解决方案,PHP解决高并发问题(opcache)
  • php邮件发送的两种方式区别,php邮件发送的两种方式是什么
  • php邮件发送的两种方式区别,php邮件发送的两种方式是什么,php邮件发送的两种方式
  • php跳转页面的几种实现方法详解图,php跳转页面的几种实现方法详解视频
  • php跳转页面的几种实现方法详解图,php跳转页面的几种实现方法详解视频,PHP跳转页面的几种实现方法详解
  • PHP购物车,php立即购买和购物车功能
  • PHP购物车,php立即购买和购物车功能,php实现购物车功能(上)
  • php读取pdf数据,php pdf读取
  • php读取pdf数据,php pdf读取,PHP中使用mpdf 导出PDF文件的实现方法
  • php网站判断用户是否是手机访问的方法有哪些,php如何判断用户是否登录
  • 留言与评论(共有 条评论)
       
    验证码: