工厂模式

Posted 寻觅beyond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。

简单工厂模式是将业务逻辑包含在一个类中,使用的时候直接调用接口,传一个参数进去,然后获得对应的对象,但是当要创建的产品对象的种类发生改变(增加或者减少),都要通过修改工厂类,这就不符合开闭原则(对修改关闭,对扩展开放)了。

工厂模式与简单工厂模式的去别就在于,如果要创建的产品对象的种类发生改变,我们只需要定义一个该类对象的一个工厂,用来专门生产这种对象。如果有疑问,可以看一下这篇博文:简单工厂模式

比如,有水果这个基类,这个基类有苹果和香蕉,那么用简单工厂模式,可以用下面的代码实现

<?php 
	abstract class Fruit{
		abstract public function say();
	}

	class Apple extends Fruit{
		public function say(){
			echo "I\'m Apple\\n";
		}
	}

	class Banana extends Fruit{
		public function say(){
			echo "I\'m banana\\n";
		}
	}

	class Factory{
		public function getFruit($fruit){
			if($fruit=="Apple"){
				return new Apple;
			} else if($fruit == "Banana"){
				return new Banana;
			} else {
				return NULL;
			}
		}
	}

	//创建一个工厂
	$factory=new Factory();

	$fruit=$factory->getFruit("Apple");
	$fruit->say();//I\'m Apple

	$fruit=$factory->getFruit("Banana");
	$fruit->say();//I\'m banana

 ?>

 那么现在又有一个水果梨,要获得梨对象,如果用简单工厂模式,如上面的代码,那就得现定义一个梨的类,然后修改factory工厂类,加一个判断条件,如果$fruit==pear,则返回一个梨对象。

现在用工厂模式,只需要定义一个梨的类,然后再定义一个抽象工厂类,然后再定义一个生产梨的工厂类,直接用生产梨工厂去生产梨,以后每增加一种水果,只需要重复做这些工作即可,不用对工厂类进行修改。比如下面的代码

<?php 
	//创建水果基类
	abstract class Fruit{
		abstract public function say();
	}
	//创建一个苹果类
	class Apple extends Fruit{
		public function say(){
			echo "I\'m Apple\\n";
		}
	}
	//创建一个香蕉类
	class Banana extends Fruit{
		public function say(){
			echo "I\'m banana\\n";
		}
	}	
	//新增了一个梨类
	class Pear extends Fruit{
		public function say(){
			echo "I\'m pear\\n";
		}
	}
	//创建一个抽象工厂来
	abstract class Factory{
		abstract public function getFruit();
	}
	//创建苹果工厂类
	class AppleFactory extends Factory{
		public function getFruit(){
			return new Apple;
		}
	} 
	//创建香蕉工厂类
	class BananaFactory extends Factory{
		public function getFruit(){
			return new Banana;
		}
	} 
	//新建一个梨工厂类
	class PearFactory extends Factory{
		public function getFruit(){
			return new Pear;
		}
	}

	$factory=new AppleFactory();
	$fruit=$factory->getFruit();
	$fruit->say();//I\'m Apple

	$factory=new BananaFactory();
	$fruit=$factory->getFruit();
	$fruit->say();//I\'m banana

	$factory=new PearFactory();
	$fruit=$factory->getFruit();
	$fruit->say();//I\'m pear
 ?>

  

以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

C++工厂模式(简单工厂工厂方法抽象工厂)