简单工厂模式
一. 简单工厂定义
提供一个创建对象实例的功能,而无需关心其具体实现,被创建的对象类型可以是接口、抽象类,也可以是具体的类。
二. 简单工厂的结构
- Api:客户端所需要的功能接口
- Impl:具体实现API的类,可能会有多个
- Factory:工厂,选择合适的实现类来创建API接口对象
- Client:客户端,通过Factory来获取API接口对象,然后面向API接口编程
// 接口的定义,可通过简单工厂来创建
interface Db
{
function coon();
}
// 具体实现
class MysqlDb implements Db
{
public function coon()
{
echo "连接MySQL数据库成功!";
}
}
class SqlLiteDb implements Db
{
public function coon()
{
echo "连接SqlLite数据库成功!";
}
}
// 工厂
class Factory
{
public static function create($type)
{
if ($type == 'mysql') {
return new MysqlDb();
} elseif ($type == 'SqlLite') {
return new SqlLiteDb();
} else {
throw new Exception('Error database type', 1);
}
}
}
// 客户端调用
Factory::create('mysql')->coon();
简单工厂的优点
- 简单工厂虽然简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。
- 通过简单工厂,实现了客户端和具体实现类的解耦。
简单工厂的缺点
- 可能增加客户端的复
- 不方便扩展子工厂
使用场景
- 如果想完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选择简单工厂,让客户端通过工厂来获取相应的接口,而无需关心具体实现。
- 如果想要把对外创建对象的职责集中管理和控制,可以选择简单工厂。