学习设计模式一定要知道它是为了什么而产生的,凡事一定有原因。
站在巨人的肩膀上学习,推荐两篇文章
--
设想一种情况:
现在我们在我们程序里面 新建了一个 mysqli 扩展的类,里面封装了数据库的一系列操作。
在我需要的时候,我会使用 new mysqli() 来调用我的数据库封装方法。
但是,有一天,我发现 mysqli 不好用了,我想用 PDO 了。
那么......
我在我的程序里面已经使用了成百次的 new mysqli 这个类,难道还是需要一个个去改么?
--
上面已经说明了在普通时候的尴尬性,所以我们需要来对这类进行解耦。
现在才感受到了“高内聚低耦合”的博大精深。没问题,工厂方法可以解决这个问题。
工厂模式的优点就在创建对象上。
工厂模式的优点就在创建对象上。建立一个工厂(一个函数或一个类方法)来制造新的对象,它的任务就是把对象的创建过程都封装起来,
创建对象不是使用new的形式了。而是定义一个方法,用于创建对象实例。
--
说道这里,反正我已经是蒙了,总的来说,工厂模式的目的是为了把新建对象的过程封装起来,只返回对象的结果
--
下面我们用代码来实现下
1:简单工厂模式
【适用范围】
工厂类负责创建的对象较少,操作时只需知道传入工厂类的参数即可,对于如何创建对象过程不用关心。
<?php class A {} class B {} class Factoty { // 简单工厂里的静态方法-用于创建A对象 static function createA() { return new A(); } // 简单工厂里的静态方法-用于创建B对象 static function createB() { return new B(); } }
$A = Factoty::createA();
$B = Factoty::createB();
这里我们隐藏了实例对象的细节,在对于对象修改中只需要修改简单的代码就可以完成。
但是他不适合对象的反复添加,只适合固定的对象。
--
2:工厂方法模式
【适用范围】
一个类希望由子类来指定它所创建的对象时,简单来说,就是希望父类的实现方式可以以子类的继承实现,这样可以扩展出不同的类,也体现的类的多态。
// 定义一个接口类 interface people { public function create(); } // 由子类来继承实现 class Factory implements people { public function create() { return new A(); } }
这样可以一直扩展多个子类。并且有好的扩展性。
--
其实关于工厂模式,一定要找到他的重点,他想干什么?
工厂模式主要就是为了解决在创建对象上产生的高耦合,使他们可以模块化,松散的组合在一起。
只要我们知道他想干什么,工厂模式可以有很多方式来实现。