简单工厂模式实现了产品类的代码跟客户端代码分离,但会有一个问题,优秀的代码是符合“开闭原则”若是你要加一个C类产品,你就要修改工厂类里面的代码,也就是说要增长条件语句如:switch---case。对于这个问题,接下来的工厂方法模式能够解决这个问题。php
工厂方法就是为配一个产品提供一个独立的工厂类,经过不一样的工厂实例来建立不一样的产品实例。mysql
//抽象产品类 abstract class DataBase { abstract function connect(); abstract function getOne(); } //具体产品类 class MySql extends DataBase { function connect() { return "MySQL链接对象返回"; } function getOne() { return "MySQL返回查询结果"; } } //具体产品类 class SqlServer extends DataBase { function connect() { return "SQL Server链接对象返回"; } function getOne() { return "SQL Server返回查询结果"; } }
//抽象工厂类 abstract class FactoryDataBase{ function createDataBase(){} } //具体工厂类 class FactoryMySql extends FactoryDataBase { public function createDataBase() { return new MySql(); } } //具体工厂类 class FactorySqlServer extends FactoryDataBase { public function createDataBase() { return new SqlServer(); } }
$mysql = new FactoryMySql(); $db1 = $mysql->createDataBase();
工厂方法模式仿佛已经把对象的建立进行了很完美的包装,使得客户程序中仅仅处理抽象产品角色提供的接口。那咱们是否必定要在代码中遍及工厂呢?大可没必要。也许在下面状况下你能够考虑使用工厂方法模式:sql