一个菜鸟驿站!

浅谈设计模式-工厂模式

PHP 2018-07-04 浏览(1932) 评论(0)
- N +

文章目录 [+]

相信很多的小伙伴看到标题的时候都是同样的疑问,在我们开发中php中很多种模式,今天我们就给大家介绍其中的一个php工厂模式,那么我们首先要明白什么是php工厂模式,为什么要用php工厂模式

工厂模式

那么什么是工厂模式

从名字来看,似乎看不出什么端倪。工厂模式,和生产有关?还是和生产流程有关?难道还和工厂领导有关?和领导秘书有关?秘书... 好了不卖关子了,所谓工厂模式还真和生产有关。生产什么呢?生产出来的是一个实例对象。通过什么设备生产?通过一个工厂类生产。怎么生产呢?工厂类调用自身静态方法生产对象实例。

工厂模式有一个关键的构造,根据一般原则命名为Factory静态方法,然而这只是一种原则,虽然工厂方法可以任意命名这个静态还可以接受任意数据的参数,必须返回一个对象

为什么要用工厂模式

很多没接触过工厂模式的人会不禁问,为啥我要费那么大的劲儿去构造工厂类创建对象呢?不去套用那些易维护,可扩展之类的话,我们可以考虑这样一个简单的问题。如果项目中,我们通过一个类创建对象。在快完成或者已经完成,要扩展功能的时候,发现原来的类类名不是很合适或者发现类需要添加构造函数参数才能实现功能扩展。我靠!我都通过这个类创建了一大堆对象实例了啊,难道我还要一个一个去改不成?我们现在才感受到了“高内聚低耦合”的博大精深。没问题,工厂方法可以解决这个问题。

再考虑一下,我要连接数据库,在php里面就有好几种方法,mysql扩展,mysqli扩展,PDO扩展。我就是想要一个对象用来以后的操作,具体要哪个,视情况而定喽。既然你们都是连接数据库的操作,你们就应该拥有相同的功能,建立连接,查询,断开连接...(此处显示接口的重要性)。总而言之,这几种方法应该“团结一致,一致对外”。如何实现呢?利用工厂模式

工厂模式如何实现

相对于单例模式,上面我们提供了足够的信息,工厂类,工厂类里面的静态方法。静态方法里面new一下需要创建的对象实例就搞定了。当然至于考虑上面的第二个问题,根据工厂类静态方法的参数,我们简单做个判断就好了。管你用if..else..还是switch..case..,能快速高效完成判断该创建哪个类的工作就好了。最后,一定要记得,工厂类静态方法返回一个对象。不是两个,更不是三个。

简单的工厂类

class MyFactory
{
	static public function factory()
	{
		return (new MyFactory());
	}
}
$instance = MyFactory::factory();

稍复杂工厂类

正如最上边的水果图所示,下边则给大家上代码。

interface Fruits{
	public function get();
}
class Apple implements Fruits{
	public function get(){
		return '你得到一个苹果';
	}
}
class Banana implements Fruits{
	public function get(){
		return '你得到一个香蕉';
	}
}
class Orange implements Fruits{
	public function get(){
		return '你得到一个橘子';
	}
}
class FruitsFactory{
	/**
	* @param $fruitName 参数名称
	*	这里可以用if或者是switch都可以
	*/
	static public function factory($fruitName){
		switch ($fruitName) {
			case 'apple':
				return (new Apple());
				break;
			case 'banana':
				return (new Banana());
				break;
			case 'orange':
				return (new Orange());
				break;
		}
		//或者是if
		if($fruitName == 'apple'){
			return (new Apple());
		}else if($fruitName == 'banana'){
			return (new Banana());
		}else if($fruitName == 'orange'){
			return (new Orange());
		}
	}
}
$fruit = FruitsFactory::factory('apple');
echo $fruit->get();//输出苹果

这里需要注意到一个问题,需要工厂静态方法为factory()的时候,千万别再傻乎乎的把工厂类命名为Factory了。为啥啊?别忘了同名构造函数的事儿啊~

感受

最后还是谈点感受吧,很多新手比较眼高手低,刚刚会了if..else..,session,cookie就要来点高大上的了。与人交谈动辄可扩展性,可维护性之类云云,至于实例的话,就会一时语塞。有时候觉得,无论自己写代码还是和别人学习,都处于“众里寻他千百度”的时候,真正踏实学习后,蓦然回首,“那人却在灯火阑珊处”,大呼:“原来这TM就是***啊”。

总结

看完这篇文章相信大家对php工厂模式有了一个大概的了解了,希望对你的工作有所帮助!建议:如果实在是不知道该在哪里使用,建议还是不要大用滥用,避免整个程序崩盘。

致谢

感谢各位看完本篇文章,最近几天一直在学习,也顺便整理一些文章,希望能够对类似我一样的菜鸟一些帮助,也同时希望大佬们有所指教,共同学习,谢谢。

标签:
作者:猫巷

,

评论列表 (0)条评论

发表评论

召唤伊斯特瓦尔