今天,边肖将与你分享一个关于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)
抽象工厂(抽象工厂)
这三种模式自上而下逐渐抽象,更加通用。
工厂方法模式也叫静态工厂方法模式;从命名可以看出,这种模式一定很简单。它的目的很简单:定义一个创建对象的接口。
工厂方法模式移除了工厂方法模式中工厂方法的静态属性,这样它就可以被子类继承。这样,工厂方法模式中工厂方法的压力就可以被工厂方法模式中不同的工厂子类分担。
工厂方法模式似乎已经完美地打包了对象的创建,因此只有抽象产品角色提供的接口才在客户端程序中处理。我们必须把代码散布到整个工厂吗?不需要。也许你可以考虑在以下情况下使用工厂方法模式:
当客户程序不需要知道要使用的对象的创建过程时。
程序使用的对象可能会改变,或者客户端根本不知道使用哪个特定的对象。
总结
这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。谢谢你的支持。如果你想了解更多,请查看下面的相关链接。