序言
顾名思义,此篇介绍工厂模式中的简单工厂,工厂模式属于创建型模式,而工厂模式分为简单工厂,静态工厂,抽象工厂,由浅到深,上篇介绍了最基本的单例,而简单工厂也是工厂模式里最基本的。
简单工厂概述
优点:实例化对象,根据参数获取对应的对象,避免直接实例化,降低耦合。
缺点:需知所有的类型,不符合设计模式的开闭原则,当类型增加,工厂也需要修改。
复制代码
简单工厂结构
Api: 用于构建用户功能,抽象接口,只负责抽象,不负责实现。
AchieveApi: 功能对象,用于实现接口。
Factory: 用于生产(创建)功能对象。
复制代码
正文
还是以故事的形式来叙述。 昨天是端午节日,放假了,小陈要回家,回家要用到车,但是回家的方式有很多种,不知道该开车回,还是坐车,还是骑自行车回。
1、功能接口
class Api {
// 要回家
public function goHome(string $message){}
}
复制代码
2、实现功能的工具
// 开车
class Car implements Api {
public function goHome(string $message) {
echo "开车回";
}
}
// 坐车
class ByCar implements Api {
public function goHome(string $message) {
echo "坐车回";
}
}
// 骑车
class RideCar implements Api {
public function goHome(string $message) {
echo "骑车回";
}
}
复制代码
3、构建工厂
class EasyFactory {
public static function getFactory(int type) {
// 约定方法
switch(type) {
case 1:
return new Car();
break;
case 2:
return new ByCar();
break;
case 3:
return RideCar();
break;
default:
die('超了');
}
}
}
复制代码
4、测试
$xiaochen1 = EasyFactory::getFactory(1); // 开车
$xiaochen1->goHome();
$xiaochen2 = EasyFactory::getFactory(2); // 坐车
$xiaochen2->goHome();
$xiaochen2 = EasyFactory::getFactory(3); // 骑车
$xiaochen2->goHome();
复制代码
总结
以上方法就是简单的工厂模式,在使用时直接进行调用,不需要知道创建的逻辑,想开车回,直接去开就可以,下次自己没时间,家里人也直接能开,不用管车是怎么造出来的(前提是知道有个车),一般简单工厂是用来隔离实现,让外部只能通过特定的接口或者方法来操作。