PHP设计模式-工厂模式
可能一直都以为设计模式只是为Java架构师准备的,实际上,设计模式对于每个人都非常有用。为什么说它们在PHP应用程序中也非常有用?
接下来让我来解释这些问题。
设计模式不仅代表着更快开发健壮软件的有用方法,而且还提供了以友好的术语封装大型理念的方法。用较小的示例展示设计模式的价值与功用是非常困难的。这往往有些大材小用的意味,因为模式实际上是在大型代码库中发挥作用的。
既然已经了解了设计模式以及它们的有用之处,现在我们来看看PHP5的几种常用模式。
一、工厂模式(Factory Pattern)
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。(JAVA中工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式)
工厂就是负责生成对象的类或方法。工厂模式解决了当代码关注于抽象类型时如何创建对象实例的问题。
在最初的设计模式一书中,许多设计模式都鼓励使用松散耦合。如何理解这个概念?在项目开发中更改一个代码片段时,就会发生问题,而且往往认为完全不相关的部分也可能出现级联破坏。该问题在于紧密耦合。如果类之间有非常强的依赖性,那么这样的系统就很难维护,因为系统里的一个改动会引起一连串的相关改动。所以我们需要一组模式使这些类之间能够相互通信,但不希望它们紧密绑定在一起,以避免出现联锁反应(严格意义上讲是叫解耦)。
在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的User类,您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类,这时候,使用工厂模式会很方便。
举例说明:
<?php abstract class IUser { //抽象产品角色 abstract function getName(); } class User extends IUser { //具体产品角色 public function getName() { return 'Jack'; } } class UserFactory { //工厂类角色 static public function create() { return new User(); //返回实例 } } $uo = UserFactory::create(); echo $uo->getName(); ?>
在简单工厂模式中,一个工厂类处于对产品实例化调用的中心位置上,它决定哪一个产品类应当被实例化,如同一个交通警察站在来往的车辆流中,决定放行哪一个方向的车辆前行。
工厂模式的三种角色:
1.工厂角色(Creator):这是本模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象产品角色(Product):工厂模式所创建的所有对象的父类。它负责描述所有实例所共有的公共接口。(一般由接口或抽象类来实现)。
3.具体产品角色(Concrete Product):是工厂模式创建的目标,所有创建的对象都是充当这个角色的某个具体类的实例。(由一个具体类实现)
工厂模式的优缺点:
优点:
1. 简单实用
2. 利于软件体系结构优化
缺点:
1. 违反高内聚责任分配原则
2. 模块功能容易蔓延,不利于系统维护
有时此类模式在规模较小的环境中似乎有点大材小用,不过,最好还是学习这种扎实的编码形式,以便应用于任意规模的项目中。
接下来篇幅会讲到单例模式。