问题:
“工厂方法模式”很好地解决了产品类横向增长的问题,而“抽象工厂模式”则是在“工厂方法模式”的基础上,考虑如何将产品类进行纵向增长的问题。
概念:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
实现:
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. 添加新产品时,不仅要创建新产品的具体实现,为了支持它,还需要修改抽象创建者和它的每一个具体实现。