工厂模式
工厂模式,顾名思义,像工厂的流水线,固定的规格,固定的材料,做固定的事情。
单例模式用户做数据库连接,工厂模式适合做数据连后的增删改查。
绝大部分的架构都会有不同的数据库驱动,在不同的情况下使用不同的数据库。
用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:很多人都在问工厂模式为什么用抽象,不用接口,
个人看法:它们在工厂模式时没有严格的区分使用,
因为接口实现的是行为,比较单一,它完全可以应用的在简单的工厂模式,
而抽象类和子类之间有比较宽泛的继承关系,但是又区别于继承关系,它在接口的关系上增加部分继承关系,因此抽象类更重。