工廠模式
工廠模式,顧名思義,像工廠的流水線,固定的規格,固定的材料,做固定的事情。
單例模式用戶做數據庫連接,工廠模式適合做數據連后的增刪改查。
絕大部分的架構都會有不同的數據庫驅動,在不同的情況下使用不同的數據庫。
用MySQL和MongoDB做具體的例子:
abstract class DB { abstract public function select(); abstract public function delete(); abstract public function insert(); abstract public function update(); } class MongoDB extends DB { public function select() { return 'class:MongoDB function select'; } public function delete() { return 'class:MongoDB function delete'; } public function insert() { return 'class:MongoDB function MongoDB'; } public function update() { return 'class:MongoDB function update'; } } class Mysql extends DB { public function select() { return 'class:Mysql function select'; } public function delete() { return 'class:Mysql function delete'; } public function insert() { return 'class:Mysql function insert'; } public function update() { return 'class:Mysql function update'; } } class factory { public static function factoryOperation($dbType) { return new $dbType; } }
上面是實現的工廠模式,通過調用
factory::factoryOperation('Mysql');
就可以實例化Mysql的操作類,並且實現被抽象類強制規定的增刪改查操作
$factory = factory::factoryOperation('Mysql'); echo $factory->select(); $factory = factory::factoryOperation('MongoDB'); echo $factory->select();
上面的結果分別輸出
"class:MongoDB function select" "class:Mysql function select"
PS:很多人都在問工廠模式為什么用抽象,不用接口,
個人看法:它們在工廠模式時沒有嚴格的區分使用,
因為接口實現的是行為,比較單一,它完全可以應用的在簡單的工廠模式,
而抽象類和子類之間有比較寬泛的繼承關系,但是又區別於繼承關系,它在接口的關系上增加部分繼承關系,因此抽象類更重。