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

[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中,工厂模式能够帮助我们解耦代码,使得代码更具有灵活性和可扩展性。在这个例子中,我们将深入探讨如何使用工厂模式来实现一个日志记录器,允许客户通过更改配置文件来灵活切换日志的存储方式。 首先,`...

    简单工厂模式详述

    简单工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这种模式在不引入复杂的工厂方法模式或抽象工厂模式的情况下,为客户端提供了创建对象的方式。简单工厂模式的核心...

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

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

    解析PHP工厂模式的好处

    在PHP中,工厂模式同样适用,并且能够带来许多好处。 首先,工厂模式可以增加代码的可维护性。如果项目中的类依赖于具体的类名进行实例化,那么当需要修改类的结构或者改变类所依赖的具体类时,需要在多处进行代码...

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

    本篇详细介绍了三种PHP中的设计模式:工厂模式、单例模式与注册树模式,并通过实例来展示它们的基本概念、原理、实现方法及使用技巧。 首先,工厂模式是一种创建型设计模式,它提供了一个创建对象的最佳方式。在...

    PHP工厂模式的日常使用

    文档中通过实例向我们介绍了PHP工厂模式的日常使用,下面我们就详细分析这一过程。 首先,工厂模式通常包含三个基本要素: 1. 工厂类(Factory):负责创建产品对象的工厂类,对具体产品的创建负责。 2. 抽象产品...

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

    PHP实现工厂模式的示例代码如下: ```php interface Creator { public function factoryMethod(); } class ConcreteCreatorA implements Creator { public function factoryMethod() { return new ...

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

    在PHP中,工厂模式能够降低代码的耦合度,提高可维护性。 在PHP中,工厂模式通常包含以下几个核心概念: 1. **工厂类**:这是工厂模式的核心,负责创建对象。工厂类通常包含一个或多个静态方法,用于根据传入的...

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

    简单工厂模式是软件设计模式中的一种,它属于...这就是关于PHP中的简单工厂模式的解释,以及如何通过一个计算器的例子来实践这一模式。这个模式在日常开发中非常常见,尤其是在需要根据条件动态创建不同类型的对象时。

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

    在软件设计模式中,单例模式和工厂模式都是常见的创建型模式,它们分别解决不同的问题。下面我们将详细探讨这两种模式。 一、单例模式 单例模式的主要目的是控制类的实例化过程,确保一个类只有一个实例,并提供一...

    工厂模式与单例模式

    在软件设计模式中,工厂模式和单例模式是两种非常基础且重要的模式,它们都是用于解决对象创建问题,但有着不同的设计理念和应用场景。本篇文章将深入探讨这两种模式,并结合具体的代码示例`myFactoryDemo`进行讲解...

    抽象工厂模式 - PHP版

    在PHP中,抽象工厂模式尤其适用于那些需要创建一系列相关或相互依赖的对象,而又不希望硬编码具体类名的情况。通过这种方式,抽象工厂模式能够将对象的创建过程与使用过程分离,提高代码的可扩展性和可维护性。 ...

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

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

    浅析php工厂模式

    在PHP中实现工厂模式,首先需要定义一个抽象的产品接口,然后创建实现该接口的具体产品类。在简单工厂模式中,工厂类会根据不同的条件来实例化具体产品。而在工厂方法模式中,每一个具体工厂类都是抽象工厂接口的一...

Global site tag (gtag.js) - Google Analytics