在面向对象的编程中,如何产生一个对象呢?即使初学面向对象语言(比如C++、Java、PHP等)的程序员也知道, 最通常的方法是一个 new caozuofu.html" target="_blank">操作符产生一个对象实例,new 操作符就是用来构造对象实例的。当我们使用 new 操作符的时候,系统默认执行类的构造函数,然后为我们生产一个对象。
?
那么,有没有不使用 new 操作符就可以创建对象的方式呢?或者说,我们在某些情况下,是不是需要寻找另外一种创建对象的方式呢?
?
那我们先看看如果直接用 new 操作符来创建对象会带来一些什么样的问题:
?
如何解决这些问题呢?复制/粘贴?肯定有更高效的,就是用我们今天将要介绍的工厂模式,下面是维基百科给出的一个解释:工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”
?
说的通俗一点就是,不需要我们使用的时候去新建(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