工厂模式使用场景:
简单来说,当需求对类的个数不明确的时候,可以使用工厂模式,如:你需要创建一个在线博物馆,但你并不确切的知道究竟有多少文物,你不可能无限的增加新的文物类,同时对于损毁的文物,你不可能无限的去清理这些类。反过来说,如果你确切的知道类的总量,那么你就没有必要使用工厂模式,直接通过继承的方式就能实现好的设计。
实例1:
<?php
//设定数据库接口
interface Db{
public function realwork();
}
//设定工厂接口
interface Factory{
public function facWorking();
}
//MySQL实际功能类
class Mysql implements Db{
public function realWork(){
return '开始使用mysql';
}
}
//Oracle
class Oracle implements db{
public function realWork(){
return '开始使用oracle';
}
}
//NoSQL实际功能类
class Nosql implements db{
public function realWork(){
return '开始使用nosql';
}
}
//对外展示的MySQL工厂类
class FacMysql implements factory{
protected static $database;
public function facWorking(){
self::$database = new Mysql();
return self::$database->realWork();
}
}
//对外展示的Oracle工厂类
class FacOracle implements factory{
protected static $database;
public function facWorking(){
self::$database = new Oracle();
return self::$database->realWork();
}
}
//对外展示的NoSQL工厂类
class FacNosql implements factory{
protected static $database;
public function facWorking(){
self::$database = new Nosql();
return self::$database->realWork();
}
}
//现在我想实现MySQL数据库的功能,但是我只需要调用MySQL的工厂类即可,我无法并且也没必要知道,实际类和方法的名字
$db = new facMysql();
print_r($db->facWorking()); //output:开始使用MySQL
?>
实例2:
<?php
interface IUser
{
function getName();
}
class User implements IUser
{
public function __construct( $id ) { }
public function getName()
{
return "Jack";
}
}
class UserFactory
{
public static function Create( $id )
{
return new User( $id );
}
}
$uo = UserFactory::Create( 1 );
echo( $uo->getName()."\n" );
?>
