使用场景 :
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
下面以切换数据库做简略举例
实现:
1.创建接口
Shape.php
<?php interface Shape { /** * 创建接口 * @return mixed */ public function db(); }
2.创建实现接口的实体类
MySQL.php
<?php include 'Shape.php'; class MySQL implements Shape { /** * 实现接口 * @return mixed|void */ public function db() { // TODO: Implement db() method. return 'Mysql'; } }
SQLite.php
<?php class SQLite implements Shape { /** * 实现接口 * @return mixed|void */ public function db() { // TODO: Implement db() method. return 'SQLite'; } }
3.创建工厂类
Factory.php
<?php include 'MySQL.php'; include 'SQLite.php'; class Factory { /** * 创建一个工厂类,生成基于给定信息的实体类的对象。 * @param $string * @return MySQL|SQLite|string */ public function getShape($string) { if ($string==''){ return ''; }elseif (strtoupper($string)=='MYSQL'){ return new MySQL(); }elseif (strtoupper($string)=='SQLITE'){ return new SQLite(); } return ''; } }
测试
index.php
<?php include 'Factory.php'; //实例化工厂 $factory = new Factory(); //获取MYSQL对象 $demo1 = $factory->getShape('mysql'); //调取db方法 echo $demo1->db(); echo '<br/>'; echo '<br/>'; //获取SQLite对象 $demo2 = $factory->getShape('sqlite'); //调取db方法 echo $demo2->db();
运行index.php