承接上篇php模式设计之 单例模式,(虽然好像关系不大)。今天讲述第二种基础的模式设计——工厂模式。php
那么何为工厂模式?html
从名字来看,彷佛看不出什么端倪。工厂模式,和生产有关?仍是和生产流程有关?难道还和工厂领导有关?和领导秘书有关?秘书... 好了不卖关子了,所谓工厂模式还真和生产有关。生产什么呢?生产出来的是一个实例对象。经过什么设备生产?经过一个工厂类生产。怎么生产呢?工厂类调用自身静态方法来生产对象实例。mysql
工厂模式有一个关键的构造,根据通常原则命名为Factory的静态方法,然而这只是一种原则,虽然工厂方法能够任意命名这个静态还能够接受任意数据的参数,必须返回一个对象。sql
为何要用工厂模式?数据库
不少没接触过工厂模式的人会不由问,为啥我要费那么大的劲儿去构造工厂类去建立对象呢?不去套用那些易维护,可扩展之类的话,咱们能够考虑这样一个简单的问题。若是项目中,咱们经过一个类建立对象。在快完成或者已经完成,要扩展功能的时候,发现原来的类类名不是很合适或者发现类须要添加构造函数参数才能实现功能扩展。我靠!我都经过这个类建立了一大堆对象实例了啊,难道我还要一个一个去改不成?咱们如今才感觉到了“高内聚低耦合”的博大精深。没问题,工厂方法能够解决这个问题。cookie
再考虑一下,我要链接数据库,在php里面就有好几种方法,mysql扩展,mysqli扩展,PDO扩展。我就是想要一个对象用来之后的操做,具体要哪一个,视状况而定喽。既然大家都是链接数据库的操做,大家就应该拥有相同的功能,创建链接,查询,断开链接...(此处显示接口的重要性)。总而言之,这几种方法应该“团结一致,一致对外”。如何实现呢?利用工厂模式。session
工厂模式如何实现?函数
相对于单例模式,上面咱们提供了足够的信息,工厂类,工厂类里面的静态方法。静态方法里面new一下须要建立的对象实例就搞定了。固然至于考虑上面的第二个问题,根据工厂类静态方法的参数,咱们简单作个判断就行了。管你用if..else..仍是switch..case..,能快速高效完成判断该建立哪一个类的工做就行了。最后,必定要记得,工厂类静态方法返回一个对象。不是两个,更不是三个。post
基本的工厂类:学习
//要建立对象实例的类 class MyObject{ } //工厂类 class MyFactory{ public static function factory(){ return new MyObject(): } } $instance=MyFactory::factory();
一个稍微复杂的工厂模式:
<?php interface Transport{ public function go(); } class Bus implements Transport{ public function go(){ echo "bus每一站都要停"; } } class Car implements Transport{ public function go(){ echo "car跑的飞快"; } } class Bike implements Transport{ public function go(){ echo "bike比较慢"; } } class transFactory{ public static function factory($transport) { switch ($transport) { case 'bus': return new Bus(); break; case 'car': return new Car(); break; case 'bike': return new Bike(); break; } } } $transport=transFactory::factory('car'); $transport->go();
须要工厂静态方法为factory()的时候,千万别再傻乎乎的把工厂类命名为Factory了。为啥啊?别忘了同名构造函数的事儿啊~
最后仍是谈点感觉吧,不少新手比较眼高手低,刚刚会了if..else..,session,cookie就要来点高大上的了。与人交谈动辄可扩展性,可维护性之类云云,至于实例的话,就会一时语塞。有时候以为,不管本身写代码仍是和别人学习,都处于“众里寻他千百度”的时候,真正踏实学习后,蓦然回首,“那人却在灯火阑珊处”,大呼:“原来这TM就是***啊”。
笔者不敢认可本身会模式设计,我也是个不足一年的初学者,分享博客只是想记录本身的学习历程,能获得知道更是梦寐以求。若是能给别人带来帮助,那就更好啦~~~
系列文章: