工厂模式

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

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

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

<?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
 ?>

  

posted @ 2017-10-30 11:13  寻觅beyond  阅读(225)  评论(0编辑  收藏  举报
返回顶部