抽象工厂(AbstractFactory)设计模式
一、定义:
一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
二、主要角色:
- 抽象工厂(AbstractFactory):它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。
- 具体工厂(Concrete Factory):实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。
- 抽象产品(Abstract Product):声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
- 具体产品(Concrete Product):实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。
三、优缺点:
优点:可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,
抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。缺点:不方便扩展,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
四、实例:
UML:
1.创建抽象工厂:
// 定义抽象工厂
interface AbstractFactory
{
// 创建活动
public function CreateActivity();
// 创建Banner
public function CreateBanner();
}
2.创建抽象产品:
// 活动抽象接口
interface AbstractActivity
{
public function createActivity();
}
// Banner抽象接口
interface AbstractBanner
{
public function createBanner();
}
3.创建具体产品:
// 创建0元购活动
class CreateFreeGift implements AbstractActivity
{
public function createActivity()
{
echo 'CreateFreeGift!' . PHP_EOL;
}
}
// 创建满减活动
class CreateFullReduction implements AbstractActivity
{
public function createActivity()
{
echo 'CreateFullReduction!' . PHP_EOL;
}
}
// 创建TopBanner
class CreateTopBanner implements AbstractBanner
{
public function createBanner()
{
echo 'CreateTopBanner!' . PHP_EOL;
}
}
// 创建BottomBanner
class CreateBottomBanner implements AbstractBanner
{
public function createBanner()
{
echo 'CreateBottomBanner!' . PHP_EOL;
}
}
4.创建具体工厂:
// 具体工厂1 创建0元购活动 TopBanner
class ConcreteFactory1 implements AbstractFactory
{
public function CreateActivity()
{
return new CreateFreeGift();
}
public function CreateBanner()
{
return new CreateTopBanner();
}
}
// 具体工厂2 创建满减活动 BottomBanner
class ConcreteFactory2 implements AbstractFactory
{
public function CreateActivity()
{
return new CreateFullReduction();
}
public function CreateBanner()
{
return new CreateBottomBanner();
}
}
5.Client:
// 工厂一
$factory1 = new ConcreteFactory1();
$createTopBanner = $factory1->CreateBanner();
$createFreeGift = $factory1->CreateActivity();
$createTopBanner->createBanner();//echo createTopBanner!
$createFreeGift->createActivity();//echo CreateFreeGift!
// 工厂二
$factory2 = new ConcreteFactory2();
$createBottomBanner = $factory2->CreateBanner();
$createFullReduction = $factory2->CreateActivity();
$createBottomBanner->createBanner();//echo createBottomBanner!
$createFullReduction->createActivity();//echo createFullReduction!