抽象工厂模式

先前有简单工厂模式工厂模式,工厂模式在简单工厂模式基础上解耦和。

而工厂模式和抽象工厂模式有什么不同呢?有人可能会发问,工厂模式的代码里面不是有个抽象的工厂类吗?

对于这一点,的确如此,但是每一个工厂类只能生产一个产品(要么香蕉,要么苹果),不能生产一个产品族(水果拼盘)。而抽象工厂模式刚好做到这一点,它能生产出一个产品族(包含很多种产品)

抽象工厂包含多个产品结构的声明,任何工厂类都必须实现这个借口。

请看下面代码:

<?php 
	//创建水果基类
	abstract class Fruit{
		abstract public function say();
	}
	//创建一个绿苹果类
	class GreenApple extends Fruit{
		public function say(){
			echo "I'm Green Apple
";
		}
	}
	//创建一个红苹果类
	class RedApple extends Fruit{
		public function say(){
			echo "I'm Red Apple
";
		}
	}
	//创建一个绿香蕉类
	class GreenBanana extends Fruit{
		public function say(){
			echo "I'm Green banana
";
		}
	}	
	//创建一个黄香蕉类
	class YellowBanana extends Fruit{
		public function say(){
			echo "I'm Yellow banana
";
		}
	}	

	//创建一个抽象工厂来
	abstract class Factory{
		abstract public function getApple();
		abstract public function getBanana();
	}
	//创建生产红苹果和黄香蕉的工厂类
	class NotGreenFactory extends Factory{
		public function getApple(){
			return new RedApple;
		}
		public function getBanana(){
			return new YellowBanana;
		}
	} 
	//创建生产绿苹果和绿香蕉水果的工厂类
	class GreenFactory extends Factory{
		public function getApple(){
			return new GreenApple;
		}
		public function getBanana(){
			return new GreenBanana;
		}
	}

	//用绿色工厂类来生产水果,生产的水果为绿色
	$factory=new GreenFactory();
	$fruit=$factory->getApple();
	$fruit->say();//I'm Green Apple

	//用非绿色工厂类来生产水果,生产的水果为非绿色
	$factory=new NotGreenFactory();
	$fruit=$factory->getBanana();
	$fruit->say();//I'm Yellow banana
 ?>

  看了上面的代码,感觉还没工厂模式好用,因为用抽象工厂模式,当有新产品的时候,不仅要创建新产品的类,还要修改抽象工厂类中的方法(添加获得新增产品的接口),然后让各具体工厂类实现,可以说是比较复杂的,很难扩展。

原文地址:https://www.cnblogs.com/-beyond/p/7753920.html