`
hjack315
  • 浏览: 610 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

[php]工厂模式

阅读更多
注明:
由于刚接触工厂模式这种概念, 对其的了解并不深入。
在我试图收集工厂模式概念/特性的资料下成果不是显著, 所以并不能对工厂模式下绝对定义。
希望有这方面资料的朋友尽可能的提供给我, 在此先表示感谢!

技术与生活最大的鸿沟应该是对事物的描述所引起的障碍, 一个抽象一个现实。
若能把抽象现实化似乎可以对理解技术的概念起到事半功倍的效果。

编程中的工厂模式我将其与现实的工厂做对比。

现实世界的工厂特性:
(有工人去操作就不算工厂特性了)
1. 针对某一个产品会有很多辅助零配件的生产线。
    假设生产汽车的外壳, 必定会有: 塑形线、打磨线、喷漆线、组装线等。
2. 有一条生产线是完成所有前期工作的汇总, 那就是组装线了。它的作用是将全部零配件组合成一个产成品最少是完成该工厂的生产任务。
3. 只要遵守产品的生产规格, 无论抽/换哪条生产线最终都不会影响到组装线的组装。
4. 工厂何时去生产需要的到客户的订单, 只有接收到订单才可能进行生产任务。

编程中的工厂模式特性(网络资料):
[来源:http://blog.csdn.net/zhengzhb/article/details/7348707]
1. 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
2. 工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。
3. 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。
4. 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。

    我觉得很多人特别是新人和我一样, 看到以上这么一大堆专业的不得了的文字描述会有些茫然。不论你会不会, 反正我会。但咱们吃技术饭的不可能说遇难而退, 所以只有硬着头皮将显示和抽象转换下。难免有些生硬, 但请谅解。

相互转换(以编程中工厂特性顺序为准):
1. 编程中[工厂接口]我将它理解为现实的[用户订单], 接口只有使用才具有作用, 工厂只有得到订单才进行生产。所以我认为工厂接口应该属于最外层的, 也就是启动工厂模式的开关。
2. 编程中的[工厂实现]就好像现实工厂的[生产线数量], 上文说(需要有多少种产品,就需要有多少个具体的工厂实现)这不说的就是生产线越多生产的东西的工序或者零配件越多嘛。
3. 编程中的[产品接口]和现实工厂的遵守[生产规格]应该是一样的, 假设汽车外壳是1M*1M大小, 如果被做成2M*2M大小不就会影响组装嘛。
4. 编程中的[产品实现]和现实工厂的[组装产品]是一样的, 如何将零配件组装起来, 如何让组装的产品具有新的特性和功能不正式编程中的产品实现吗。

    有一点我需要说明, 工厂中不一定要按照流程去生产。也有肯能这个工厂某方面比较强大(比方说打磨), 别的公司需要对他们的产品进行打磨, 故仅开启一条流水线仅执行一部分工作也是合理的。

    说了两者的比较那再说说(编程)工厂模式中的一些重点, 可以记忆。依然来源于网络做的总结。

适用性:
[来源: http://blog.csdn.net/zhaoxuejie/article/details/7072878]
1. 当一个类不知道它所必须创建的对象的类的时候;
    注-> 需要根据传参判断(if或者switch)应该实例化哪个类。
2. 当一个类希望由它的子类来指定它所创建的对象的时候;
    注-> 需要被继承的接口去实现具体的功能(implements)我就用继承来描述吧。
3. 当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化;
    注-> 需要通过返回值而不是直接去new一个类。

    优缺点我就不费劲去写了, 我引用了那么多地址, 可以去看看。
    我觉得有一个关键点, 就是工厂类中实现工厂的方法必须是静态的。
    很多文章都提到了这点, 但没说为什么。我找到了一些说法, 但不一定准确。仅作参考吧!

为什么用静态方法:
[来源: http://blog.csdn.net/tcwsyt/article/details/6366511]
[其他: http://www.spasvo.com/news/html/2012121994439.html]
优点1:静态方法创建对象时更容易让人理解, 业务逻辑都封装在类的构造函数或者自身的函数中,无法从新建对象里很直观的表达意思。
优点2:静态方法创建对象更灵活, 它不但可以返回这个类的对象, 也可以返回它子类的对象。
优点3:静态方法可能不需要新建一个对象,而是返回一个已经存在的对象,例如单例模式。

说实话, 现在也不清楚为什么用静态。

拿具体代码来说明问题吧。
<?php  
// 汽车工厂需要的基本功能  
interface funInFactory 
{  
    public function doWork();   
}  
  
// 塑形->流水线
class Pattern implements funInFactory 
{  
      
    public function doWork()
	{  
        echo '钢板塑形!<br />';  
    }  
}

// 打磨->流水线
class Polish implements funInFactory 
{  
      
    public function doWork()
	{  
        echo '钢板打磨!<br />';  
    }  
}

// 喷漆->流水线
class Paint implements funInFactory 
{  
      
    public function doWork()
	{  
        echo '钢板喷漆!<br />';  
    }  
}

// 工厂
class ProductFactory
{
	// 产品组装[这就是静态方法, 看见没, 静态...]
	public static function factory( $work )
	{
		$class = '';
		
		// 选择开启哪条生产线
		switch( $work )
		{
			case 'pattern': $class = 'Pattern'; break;
			case 'polish': $class = 'Polish'; break;
			case 'paint': $class = 'Paint'; break;
		}
		
		// 执行开启命令 返回开启结果
		$step = new $class();
		return $step;
	}
}

// 其实工厂类中完全没有必要去写switch, 用 $step = new ucfirst( $work() ); 就可完成相同功能。 
// 但为了表现出工厂的这种可选择特性(有些书叫这种可选择方式为多态)就用这种麻烦的写法。
// 订单
$order = ProductFactory::factory( 'paint' );
$order -> doWork();
?>  
分享到:
评论

相关推荐

    工厂模式 - PHP版

    工厂模式,php版本的,学习设计模式写的...

    PHP 简单工厂模式例子

    php 设计模式 简单工厂模式

    解析PHP工厂模式的好处

    本篇文章是对PHP工厂模式的好处进行了详细的分析介绍,需要的朋友参考下

    PHP工厂模式、单例模式与注册树模式实例详解

    主要介绍了PHP工厂模式、单例模式与注册树模式,结合实例形式工厂模式、单例模式与注册树模式的基本概念、原理、实现方法及使用技巧,需要的朋友可以参考下

    设计模式之PHP项目应用(简单工厂模式:计算器)

    1)程序功能:用简单工厂模式实现计算器功能,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/45692995。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目应用...

    PHP实现工厂模式设计日志记录器

    PHP实现工厂模式设计日志记录器,客户可通过修改配置文件灵活地改变日志记录方式

    简单工厂模式详述

    关于简单工厂模式的详细介绍,有需要学习的看看吧。还是那句话,好东西要大家分享,别忘了支持哦。

    PHP工厂模式简单实现方法示例

    本文实例讲述了PHP工厂模式简单实现方法。分享给大家供大家参考,具体如下: 工厂模式是一种类,建立了一个工厂来根据所需来创建对象,这种方式在多态性编程中是很重要的,允许动态替换类,修改配置等。 php示例代码...

    php单例模式和工厂模式

    php单例模式php单例模式php单例模式php单例模式

    学习php设计模式 php实现工厂模式(factory)

    主要介绍了php设计模式中的工厂模式,使用php实现工厂模式,感兴趣的小伙伴们可以参考一下

    php设计模式之简单工厂模式详解

    本文以实例形式较为详细的介绍了PHP设计模式的简单工厂模式,对于进行PHP程序设计来说有很好的借鉴作用。具体如下: 一、概念 简单工厂模式 【静态工厂方法模式】(Static Factory Method) 是类的创建模式 工厂模式的...

    PHP设计模式之工厂模式实例总结

    主要介绍了PHP设计模式之工厂模式,简单介绍了工厂模式的概念、原理并结合实例形式总结分析了工厂模式的具体定义及使用方法,需要的朋友可以参考下

    设计模式一:简单工厂模式(PHP源码)

    设计模式PHP版:简单工厂模式实例。 以计算器的实现为实例,说明了简单工厂模式的实现方法。

    PHP5设计模式-抽象工厂模式实现

    PHP实现的抽象工厂模式,大家可以下载来参考学习下。

    PHP设计模式之工厂模式定义与用法详解

    主要介绍了PHP设计模式之工厂模式,结合实例形式详细分析了php工厂模式的概念、原理、定义、用法及相关操作注意事项,需要的朋友可以参考下

    浅析php工厂模式

    本系列文章来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。 设计模式的一般介绍在第一篇文章讲了,这里就不重复。 工厂模式 实现:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 ...

    PHP单例模式与工厂模式详解

    一、单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。 所有的单例模式至少拥有以下三种公共元素: 1. 它们必须拥有一个构造函数,并且必须被标记为...

Global site tag (gtag.js) - Google Analytics