从最早开始读书的时候都听过工厂模式,那时候对所谓的依赖,解耦,并没有很深的印象。
读书的时候老师举个例子都会以动物来讲:
//动物的接口
interface Animal{
function say();
}
这个时候我们定义一只猫的类
class Cat implements Animal{
function say(){
echo '猫喵喵叫';
}
}
我们再定义一个狗的类
class Dog implements Animal{
function say(){
echo '狗汪汪叫';
}
}
这时我们定义一个家的类
在没有工厂模式的时候
class Home{
function test(){
//我们需要一只猫
$cat = new Cat();
$cat -> say();
//我们需要一只狗
$dog = new Dog();
$dog -> say();
}
}
这样很正常不是么?
果真我还是图样图森破。
下面我们来看用工厂模式以后的效果
//定义动物工厂类
class AnimalFactory{
function create($type){
switch($type){
case 'cat':
return new Cat();
break;
case 'dog':
return new Dog();
break;
}
}
}
这个时候我们再来修改Home类
class Home{
function test(){
$factory = new AnimalFactory();
//我们需要一只猫
$cat = $factory -> create('cat');
$cat -> say();
//我们需要一只狗
$dog = $factory -> create('dog');
$dog -> say();
}
}
卧槽 这特么不是一样么?你在逗我?这不还是有依赖么?
在我看来这只不过是把构建对象的方法不去new了 ,别的有什么区别么?
直到今天,我再看laravel的教程时,看到《Laravel 服务容器实例教程 —— 深入理解控制反转(IoC)和依赖注入(DI)》这一节时,我看到这样一句话“我们不再需要在超人初始化之初,去初始化许多第三方类,只需初始化一个工厂类,即可满足需求”。
so ? 我们以前需要引Cat和Dog两个类 现在我们只需要引入一个AnimalFactory类就行了
这就是差别。哈哈哈哈哈哈
但是我们的扩展变得更加方便了 ,当我们再来一只Pig的时候,只需要修改工厂类即可。。
文章里还有一句话是:这才刚刚开始。
是的,这才刚刚开始。