最常用的实例化对象模式,用工厂方法替代了实例化对象.
应用场景:
A.一个类的子类经常面临着剧烈变化,但却拥有较稳定的接口,或者说拥有相同的接口.工厂方法定义一个用于创建对象的接口,让子类来决定创建那个对象,将对象的实例化延迟.
B.如给定一张图片,生成对应的图片并添加水印.图片格式有png,jpg等,但他们都需要创建图片,添加水印等方法.
C.工厂接口根据参数来创建不同的子类对象,提供不同类型的相同方法.
1.简单工厂:
工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关类,对于客户端来说,去除了与相关产品的依赖,但随着条件的增多,判断逻辑会增多.
UML图:
实例代码:
abstract class DbServer { protected $link; public function __construct() { } abstract public function connect(); } class MySQL extends DbServer { public function connect() { // TODO: Implement connect() method. } } class SqlServer extends DbServer { public function connect() { // TODO: Implement connect() method. } } class DbFactory { const MYSQL = 'MySQL'; const SQLSERVER = 'SqlServer'; public static function createDb($type) { switch ($type) { case self::MYSQL: case self::SQLSERVER: return new $type(); default: throw new Exception("{$type} class is not exist"); } } } $db = DbFactory::createDb(DbFactory::MYSQL); $db->connect();
2.工厂方法:
定义一个用于创建对象的接口,让子类决定实例化那个类,工厂模式是一个类的实例化被延迟到子类.
UML图:
示例代码:
abstract class DbServer { protected $link; public function __construct() { } abstract public function connect(); } class MySQL extends DbServer { public function connect() { // TODO: Implement connect() method. } } class SqlServer extends DbServer { public function connect() { // TODO: Implement connect() method. } } interface FactoryInterface { public static function createDb(); } class MySqlFactory implements FactoryInterface { public static function createDb() { return new MySQL(); } } class SqlServerFactory implements FactoryInterface { public static function createDb() { return new SqlServer(); } } $db = SqlServerFactory::createDb(); $db->connect();