理解PHP的工厂模式Factory Pattern

高洛峰
发布: 2016-12-17 10:53:40
原创
1236人浏览过

工厂类就是一个专门用来创建其它对象的类,工厂类在多态性编程实践中是非常重要的。它允许动态替换类,修改配置,会使应用程序更加灵活。掌握工厂模式对web开发是必不可少的。

工厂模式通常用来返回类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者。

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

Program List:基本的工厂类

   <?php
class Fruit {
// 对象从工厂类返回
}

Class FruitFactory {

public static function factory() {
// 返回对象的一个新实例
return new Fruit();
}
}

// 调用工厂
$instance = FruitFactory::factory();
?>

Program List:利用工厂类生产对象

立即学习PHP免费学习笔记(深入)”;

   <?php
class Example
{
   // The parameterized factory method
   public static function factory($type)
   {
       if (include_once 'Drivers/' . $type . '.php') {
           $classname = 'Driver_' . $type;
           return new $classname;
       } else {
           throw new Exception('Driver not found');
       }
   }
}
// Load a MySQL Driver
$mysql = Example::factory('MySQL');
// Load an SQLite Driver
$sqlite = Example::factory('SQLite');
?>

Program List:一个完整的工厂类

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

<?php
   
   /**
    * Generic Factory class
    *
    * This Magic Factory will remember all operations you perform on it,
    * and apply them to the object it instantiates.
    *
    */
   class FruitFactory {
       private $history, $class, $constructor_args;
       
       /**
        * Create a factory of given class. Accepts extra arguments to be passed to
        * class constructor.
        */
       function __construct( $class ) {
           $args = func_get_args();
           $this->class = $class;
           $this->constructor_args = array_slice( $args, 1 );
       }
       
       function __call( $method, $args ) {
           $this->history[] = array(
               'action'    => 'call',
               'method'    => $method,
               'args'   => $args
           );
       }
       
       function __set( $property, $value ) {
           $this->history[] = array(
               'action'    => 'set',
               'property'    => $property,
               'value'        => $value
           );
       }
       
       /**
        * Creates an instance and performs all operations that were done on this MagicFactory
        */
       function instance() {
           # use Reflection to create a new instance, using the $args
           $reflection_object = new ReflectionClass( $this->class );
           $object = $reflection_object->newInstanceArgs( $this->constructor_args );
           
           # Alternative method that doesn't use ReflectionClass, but doesn't support variable
           # number of constructor parameters.
           //$object = new $this->class();
           
           # Repeat all remembered operations, apply to new object.
           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'];
               }
           }
           
           # Done
           return $object;
       }
   }
   
   class Fruit {
       private $name, $color;
       public $price;
       
       function __construct( $name, $color ) {
           $this->name = $name;
           $this->color = $color;
       }
       
       function setName( $name ) {
           $this->name = $name;
       }
       
       function introduce() {
           print "Hello, this is an {$this->name} {$this->sirname}, its price is {$this->price} RMB.";
       }
   }
   
   # Setup a factory
   $fruit_factory = new FruitFactory('Fruit', 'Apple', 'Gonn');
   $fruit_factory->setName('Apple');
   $fruit_factory->price = 2;
   
   # Get an instance
   $apple = $fruit_factory->instance();
   $apple->introduce();
?>

程序运行结果:

Hello, this is an Apple , its price is 2 RMB.

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56
查看详情 文心大模型

工厂模式可以分为三类:

简单工厂模式(Simple Factory)

工厂方法模式(Factory Method)

抽象工厂模式(Abstract Factory)

这三种模式从上到下逐步抽象,并且更具一般性。

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。

工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口。那我们是否一定要在代码中遍布工厂呢?大可不必。也许在下面情况下你可以考虑使用工厂方法模式:

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

客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。

更多理解PHP的工厂模式Factory Pattern相关文章请关注PHP中文网!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号