php工厂模式详解

php工厂模式详解工厂类就是一个专门用来创建其它对象的类,工厂类在多态性编程实践中是非常重要的。它允许动态替换类,修改配置,会使应用程序更加灵活。掌握工厂模式对Web开发是必不可少的。工厂模式通常用来返回类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者。通常工厂模式有一个关键的构造,即一般被命名为factory的静态方法。这个静态方法可以接受任意数量的参数,并且必须返回一个对象。P

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

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

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

Program List:基本的工厂类

01 <?php
02     class Fruit {
03         // 对象从工厂类返回
04  }
05  
06     Class FruitFactory {
07          
08         public static function factory() {
09             // 返回对象的一个新实例
10             return new Fruit();
11         }
12  }
13  
14     // 调用工厂
15     $instance = FruitFactory::factory();
16 ?>

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

01 <?php
02 class Example
03 {
04     // The parameterized factory method
05     public static function factory($type)
06  {
07         if (include_once 'Drivers/' $type '.php') {
08             $classname 'Driver_' $type;
09             return new $classname;
10         else {
11             throw new Exception('Driver not found');
12         }
13  }
14 }
15 // Load a MySQL Driver
16 $mysql = Example::factory('MySQL');
17 // Load an SQLite Driver
18 $sqlite = Example::factory('SQLite');
19 ?>

Program List:一个完整的工厂类

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

01 <?php
02  
03     /**
04      * Generic Factory class
05  *
06      * This Magic Factory will remember all operations you perform on it,
07      * and apply them to the object it instantiates.
08  *
09      */
10     class FruitFactory {
11         private $history$class$constructor_args;
12          
13         /**
14          * Create a factory of given class. Accepts extra arguments to be passed to
15          * class constructor.
16          */
17         function __construct( $class ) {
18             $args = func_get_args();
19             $this->class $class;
20             $this->constructor_args = array_slice$args, 1 );
21         }
22          
23         function __call( $method$args ) {
24             $this->history[] = array(
25                 'action'    => 'call',
26                 'method'    => $method,
27                 'args'      => $args
28             );
29         }
30          
31         function __set( $property$value ) {
32             $this->history[] = array(
33                 'action'    => 'set',
34                 'property'    => $property,
35                 'value'        => $value
36             );
37         }
38          
39         /**
40          * Creates an instance and performs all operations that were done on this MagicFactory
41          */
42         function instance() {
43             use Reflection to create a new instance, using the $args
44             $reflection_object new ReflectionClass( $this->class );
45             $object $reflection_object->newInstanceArgs( $this->constructor_args );
46              
47             # Alternative method that doesn't use ReflectionClass, but doesn't support variable
48             # number of constructor parameters.
49             //$object = new $this->class();
50              
51             # Repeat all remembered operations, apply to new object.
52             foreach$this->history as $item ) {
53                 if$item['action'] == 'call' ) {
54                     call_user_func_array( array$object$item['method'] ), $item['args'] );
55                 }
56                 if$item['action'] == 'set' ) {
57                     $object->{
$item['property']} = $item['value'];
58                 }
59             }
60              
61             # Done
62             return $object;
63         }
64  }
65  
66     class Fruit {
67         private $name$color;
68         public $price;
69          
70         function __construct( $name$color ) {
71             $this->name = $name;
72             $this->color = $color;
73         }
74          
75         function setName( $name ) {
76             $this->name = $name;
77         }
78          
79         function introduce() {
80             print "Hello, this is an {$this->name} {$this->sirname}, its price is {$this->price} RMB.";
81         }
82  }
83  
84     # Setup a factory
85     $fruit_factory new FruitFactory('Fruit''Apple''Gonn');
86     $fruit_factory->setName('Apple');
87     $fruit_factory->price = 2;
88  
89     # Get an instance
90     $apple $fruit_factory->instance();
91     $apple->introduce();
92 ?>

程序运行结果:

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

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

工厂模式可以分为三类:

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)

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

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

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

  • 当客户程序不需要知道要使用对象的创建过程。
  • 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164367.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android开发13——内容提供者ContentProvider的基本使用

    Android开发13——内容提供者ContentProvider的基本使用

    2021年8月26日
    50
  • ubuntu18.04左侧的任务栏dock面板设置「建议收藏」

    ubuntu18.04左侧的任务栏dock面板设置「建议收藏」作用调整任务栏宽度,图标大小,是否隐藏,放置底部1.安装sudoapt-getinstallunity-tweak-toolsudoapt-getinstallgnome-shell-extension-dashtodock2.重启或下面代码alt+f2在窗口里输入r,然后回车等待重启完成3.执行unity-tweak-tool4.设置…

    2022年9月11日
    0
  • 2020年Android面试题汇总(初级)-简书_android经典面试题

    2020年Android面试题汇总(初级)-简书_android经典面试题Android面试题及答案(2022年最新Android面试题大全带答案),发现网上很多Android面试题整理都没有答案,所以花了很长时间搜集,本套Android面试题大全,Android面试题大汇总,有大量经典的Android面试题以及答案,包含Android语言常见面试题、Android工程师高级面试题及一些大厂Android开发面试宝典,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习!这套Android面试题汇总大全,希望对大家有帮助哈~此面试题合集分为9个部分:Java基础、And

    2022年8月28日
    0
  • securecrt 乱码

    SecureCRT连接Linux时经常会看到乱码。发生乱码的原因主要是有三个地方1.Linux的etc的系统默认配置的编码2.用户环境变量里面设置的LANG变量3.SecureCRT会话变量里面的字符集的设置只要保持这三个地方的字条集编码保持一致就可以了。解决步骤如下:1.设置用户的环境变量查询当前用户的Local信息:[root@devdbserver…

    2022年4月7日
    56
  • 安卓和ios之间文件互传_安卓转移到iphone12

    安卓和ios之间文件互传_安卓转移到iphone12如果之前是安卓用户,在购买iphone12新款手机之后,如何从安卓转移数据到ios?可以通过苹果官方提供的“转移到ios”应用,将安卓手机中的内容进行转移,感兴趣的朋友快来看看吧!如何将数据从安卓设备转移到iphone12可转移的内容包括:通讯录、信息历史记录、相机照片和视频、web书签、邮件帐户和日历。转移完成之后,您可以从appstore下载任何匹配的免费app。使用前准备…

    2022年9月18日
    0
  • 向量范数与矩阵范数的理解题_矩阵范数的性质

    向量范数与矩阵范数的理解题_矩阵范数的性质要更好的理解范数,就要从函数、几何与矩阵的角度去理解,我尽量讲的通俗一些。我们都知道,函数与几何图形往往是有对应的关系,这个很好想象,特别是在三维以下的空间内,函数是几何图像的数学概括,而几何图像是函数的高度形象化,比如一个函数对应几何空间上若干点组成的图形。但当函数与几何超出三维空间时,就难以获得较好的想象,于是就有了映射的概念,映射表达的就是一个集合通过某种关系转为另外一个集合。通常数学书是先…

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号