【案例】
承接上一篇工厂方法模式。由于市场需求变化,客户对猪产生兴趣,黑枣克隆公司不能不扩张生产线,以生产猪。
【分析OOA】
工厂方法模式为狗族提供了统一的创建接口。当有多个产品族时,可以使用抽象工厂模式。
【设计OOD】
<UML>
<说明>
看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
1、抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。
2、具体工厂(Concrete Factory)角色:实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。
3、抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
4、具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。编程 OOP:
【代码】
interface AnimalFactory
{
public function createDog($color);
public function createPig($color);
}
class BigAnimalFactory implements AnimalFactory
{
public function createDog($color)
{
$dogtype = ucfirst(strtolower($color)) . 'BigDog';
if (class_exists($dogtype)) {
return new $dogtype();
}
}
public function createPig($color)
{
$pigtype = ucfirst(strtolower($color)) . 'BigPig';
if (class_exists($pigtype)) {
return new $pigtype();
}
}
}
class SmallAnimalFactory implements AnimalFactory
{
public function createDog($color)
{
$dogtype = ucfirst(strtolower($color)) . 'SmallDog';
if (class_exists($dogtype)) {
return new $dogtype();
}
}
public function createPig($color)
{
$pigtype = ucfirst(strtolower($color)) . 'SmallPig';
if (class_exists($pigtype)) {
return new $pigtype();
}
}
}
interface Dog
{
public function shout();
}
class BlackBigDog implements Dog
{
public function shout()
{
echo "BlackBigDog Wao!Wao!Wao! \n";
}
}
class BlackSmallDog implements Dog
{
public function shout()
{
echo "BlackSmallDog Wao!Wao!Wao! \n";
}
}
interface Pig
{
public function shout();
}
class BlackSmallPig implements Pig
{
public function shout()
{
echo "BlackSmall Zhi!Zhi!Zhi! \n";
}
}
class BlackBigPig implements Pig
{
public function shout()
{
echo "BlackGigPig Zhi!Zhi!Zhi! \n";
}
}
【测试用例Test Case】
<代码>
class testDriver
{
public function run()
{
$bigfactory = new BigAnimalFactory();
$dog1 = $bigfactory->createDog('black');
$dog1->shout();
$pig1 = $bigfactory->createPig('black');
$pig1->shout();
$smallfactory = new SmallAnimalFactory();
$dog2 = $smallfactory->createDog('black');
$dog2->shout();
$pig2 = $smallfactory->createPig('black');
$pig2->shout();
}
}
【输出】
【小结】
抽象工厂方法经常心工厂方法方式实现,抽象工厂的任务是定义一个负责创建一系列产品的接口。这个接口内每一个方法负责创建一个具体实例。
1、工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象
2、抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中
3、抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上,抽象工厂负责创建多个相关族产品,而工厂方法模式只用于单一族产品。
********************************************
* 作者:叶文涛
Php设计模式之工厂模式(三)【抽象工厂模式 AbstractFactory】
* 参考:
* 《Head First设计模式》Eric Freeman等著
*《PHP高级程序设计:模式、框架和测试》 Kevin McArthur 著 汪泳 等译
******************转载请注明来源 ***************