抽象工厂模式

问题:
“工厂方法模式”很好地解决了产品类横向增长的问题,而“抽象工厂模式”则是在“工厂方法模式”的基础上,考虑如何将产品类进行纵向增长的问题。

概念:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

实现:
1. 类图示例:

抽象工厂模式

2. 代码示例:

//创建者抽象基类
abstract class CommsManager
{
	abstract public function getHeaderText();
	abstract public function getApptEncoder();
	abstract public function getTtdEncoder();
	abstract public function getContactEncoder();
	abstract public function getFooterText();
}
//创建者子类
class BloggsCommsManager extends CommsManager
{
	public function getHeaderText()
	{
		return "BloggsCal header
";
	}
	public function getApptEncoder()
	{
		return new BloggsApptEncoder();
	}
	public function getTtdEncoder()
	{
		return new BloggsTtdEncoder();
	}
	public function getContactEncoder()
	{
		return new BloggsContactEncoder();
	}
	public function getFooterText()
	{
		return "BloggsCal footer
";
	}
}

效果:
优点:
1. 只对系统中功能相关的元素强制进行组合。易于切换产品系列,只要改变实例化的具体工厂,就可以切换到不同的产品系列。
2. 产品实例创建与客户端分离。
缺点:
1. 添加新产品时,不仅要创建新产品的具体实现,为了支持它,还需要修改抽象创建者和它的每一个具体实现。