抽象工厂模式

Posted 寻觅beyond

tags:

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

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

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

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

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

请看下面代码:

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

	//创建一个抽象工厂来
	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
 ?>

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

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

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

设计模式 创建者模式 工厂设计模式 -- 抽象工厂设计模式介绍和实现

设计模式:抽象工厂模式

设计模式11:抽象工厂模式

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

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