如果某个类在很多的文件中都new ClassName(),那么万一这个类的名字发生变更或者参数发生变化,如果不使用工厂模式,就需要修改每一个php代码,使用了工厂模式之后,只需要修改工厂类或者方法就可以了。
工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。
使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合
要使用的不同方法:
<?php //eg1 class Test1{ static function test(){ echo __FILE__; } } //eg2 require_once('people.php'); class man implements people{ public function say(){ echo '<br>我是man<br>'; } public function read(){ } } class women implements people{ public function say(){ echo '我是women<br>'; } public function read(){ } } ?>
定义工厂类:
<?php require_once('test.php'); //eg1 class Factory{ static function createDatabase(){ $test = new Test1(); return $test; } } //eg2 class SimpleFactory{ //简单工厂里的静态方法-用于创建男人对象 static function createMan(){ return new man(); } //简单工厂里的静态方法-用于创建女人对象 static function createWomen(){ return new women(); } } ?>
定义eg2的接口:
<?php /** * eg2 * Interface people */ interface people{ public function say(); public function read(); } ?>
执行代码:
<?php /** * 具体调用 */ require_once('Factory.php'); //eg1 $test = Factory::createDatabase(); $test->test(); //eg2 if(isset($_GET['male'])){ echo '1<br>'; $man = SimpleFactory::createMan(); }else{ echo '2<br>'; $man = SimpleFactory::createWomen(); } $man->say(); ?>
eg2使用了interface接口,
接口是规定某类必须实现接口中定义的方法,通过关键字interface定义,但是接口中不需要定义方法的具体内容,既不需要有方法体。且,所有的方法都必须是公共的(public)。
好处是规范,每个类都统一。平级的类都必须实现接口中的方法,只是实现的方式不一样。
使用的规范是:
不能实例化,只能通过implements来声明。使用‘,’间隔,可以声明多个接口。
接口中的属性必须是常量。
接口中的方法必须是public,且没有方法体
接口间可以互相继承