`
web001
  • 浏览: 96263 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

PHP设计模式:工厂模式(The Factory Pattern)

    博客分类:
  • PHP
阅读更多

在面向对象的编程中,如何产生一个对象呢?即使初学面向对象语言(比如C++、Java、PHP等)的程序员也知道, 最通常的方法是一个 new 操作符产生一个对象实例,new 操作符就是用来构造对象实例的。当我们使用 new 操作符的时候,系统默认执行类的构造函数,然后为我们生产一个对象。

 

那么,有没有不使用 new 操作符就可以创建对象的方式呢?或者说,我们在某些情况下,是不是需要寻找另外一种创建对象的方式呢?

 

那我们先看看如果直接用 new 操作符来创建对象会带来一些什么样的问题:

 

  1. 我们想要在创建对象的同时进行不同的初始化操作; 
  2. 我们需要生成这个对象的不同的子对象; 
  3. 在创建这个对象之前,我们需要创建所有它的依赖对象。 

如何解决这些问题呢?复制/粘贴?肯定有更高效的,就是用我们今天将要介绍的工厂模式,下面是维基百科给出的一个解释:工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”

 

说的通俗一点就是,不需要我们使用的时候去新建(new)一个对象了,而且可以根据需求,当我们需要对象的时候,用工厂来生产一个或者N个,嘻嘻,还可以量产的,如果遇到买5赠1的话,…,有点跑题了,下面写段代码来直观感受一下工厂模式。

 

未使用工厂模式的数据库代码:

 

$db = new MySql($user, $password, $database); 

 

使用工厂模式的数据库代码:

 

$db = DBFactory::create_connection();

 

前者代码使用的是传统方法,用 new 操作符生成一个新的对象,后者使用了工厂方法,用一个工厂来生产对象。从代码上来看,两者没有什么本质的区别,但是在实现上,工厂方法可以根据不同的需求生产出不同的对象。在第一种方法上,我们的 $db 只能是 MySql 类型,但是在工厂方法中,我们的 $db 可以是任何的实现了 Database 类的子类,可以是 MySql、MsSqlServer等。

 

工厂方法体现了一个面向对象的思想——封装。设计模式的理念不是封装数据和方法,而是封装变化。当我们需要创建的对象不是 MySql 时,我们只需要修改工厂的 create_connection() 方法,保留工厂方法的接口不变。

 

原文链接:http://tjwzjs.cn/news/knowledge/2012/1212/60.html

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics