简单工厂模式
<?php
//简单工厂模式
/*接口*/
interface db{
function conn();
}
class dbmysql implements db{
public function conn(){
echo '连接上了mysql';
}
}
class dboracle implements db{
public function conn(){
echo '连接上了oracle';
}
}
/*开放一个工厂方法,不能让人直接new,只能通过工厂中的createDB来获得对象*/
class Factory{
public static function createDB($type){
if($type == 'mysql')
return new dbmysql();
elseif($type == 'oracle')
return new dboracle();
else
return 'error';
}
}
/*客户端,并不知道有哪些数据库类,只知道工厂方法,调用工厂方法createDB*/
$mysql = Factory::createDB('mysql');
$mysql->conn();
$oracle = Factory::createDB('oracle');
$mysql->conn();
/*弊端:对于扩展并不理想,比如想要添加mongodb的数据类,那么服务端需要修改factory方法,如果是php脚本还好,但是如果是java,c++则需要重新编译,这是面向对象设计的重要法则,开闭原则:对于修改是封闭的,对于扩展是开放的*/
工厂模式
<?php
//工厂模式
/*接口,新添加了一个工厂接口*/
interface db{
function conn();
}
interface factory{
function createDB();
}
class dbmysql implements db{
public function conn(){
echo '连接上了mysql';
}
}
class dboracle implements db{
public function conn(){
echo '连接上了oracle';
}
}
class mysqlFactory implements factory{
public function createDB(){
return new dbmysql();
}
}
class oracleFactory implements factory{
public function createDB(){
return new dboracle();
}
}
/*服务端添加一个mongodb数据类,只需要包含一个类文件就可以了,不需要修改之前简单工厂中的factory类*/
class dbmongodb implements db{
public function conn(){
echo '连接上mongodb';
}
}
class mongodbFactory implements factory{
public function createDB(){
return new dbmongodb();
}
}
//客户端调用
$factory = new mongodbFactory();
$mongodb = $factory->createDB();
$mongodb->conn();
在接口应用的时候,可以用工厂模式,因为总是有许多的判断,if。。。elseif。。。else这样的,比如判断返回接口数据类型是json,xml等,比如判断接口aciton函数动作是什么。可以用到开闭原则,优雅的省略了if,else判断,便于扩展,避免了修改原先的代码。但是这里的
$this->AnalysisData->$act();不过总有些忐忑,不知道这样参数形式调用类里面的方法对不对?
<?php
class httpUnit{
protected $AnalysisData = null;
public function setAnalysisData($AnalysisData){
$this->AnalysisData = new $AnalysisData;
}
public function analysis($type){
$AnalysisData = $this->AnalysisData;
$AnalysisData->analysis($type);
}
public function action($act){
$this->AnalysisData->$act();
}
}
/*解析数据接口,扩展的时候只要添加,XXXAnalysisDate类就可以了*/
interface AnalysisData{
public function analysis($type);
}
class JsonAnalysisDate implements AnalysisData{
public function analysis($type) {
echo $type;
}
public function action(){
echo "\n\r action";
}
}
class XmlAnalysisDate implements AnalysisData{
public function analysis($type) {
echo $type;
}
}
$http = new httpUnit();
$http->setAnalysisData('JsonAnalysisDate');
$http->analysis('json');
$http->action('action');