介绍
抽象工厂声明一个创建抽象产品对象的接口,通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类.
优缺点
优点
当一个产品族中的多个对象被设计成一起工作时,能保证客户端始终只使用同一个产品族中的对象.
缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的工厂里加代码,又要在具体的里面加代码.
演示
以QQ皮肤套装为例.
定义套装接口
// 定义抽象套装接口
interface AbstractSuit
{
// 获取套装配置
function getSuit();
// 定义背景
function background();
// 定义气泡
function bubble();
// 定义模型
function model();
}
定义类实现套装接口
// 默认套装
class DefaultSuit implements AbstractSuit
{
public function getSuit()
{
$this->background();
$this->model();
$this->bubble();
}
public function background()
{
echo '使用白色背景;';
}
public function bubble()
{
echo '使用蓝色气泡;';
}
public function model()
{
echo '使用蓝白气泡.';
}
}
// 定义vip套装
class VipSuit implements AbstractSuit
{
public function getSuit()
{
$this->background();
$this->model();
$this->bubble();
}
public function background()
{
echo '使用红色背景;';
}
public function bubble()
{
echo '使用红色气泡;';
}
public function model()
{
echo '使用红色气泡.';
}
}
定义工厂接口
// 定义工厂接口
interface Factory
{
function getConfig();
}
定义类实现工厂接口
// 默认工厂
class DefaultFactory implements Factory
{
public function getConfig()
{
return new DefaultSuit();
}
}
// vip工厂
class VipFactory implements Factory
{
public function getConfig()
{
return new VipSuit();
}
}
实现
// 获取默认套装
$default = (new DefaultFactory())->getConfig()->getSuit();
echo PHP_EOL;
// 获取vip套装
$vip = (new VipFactory())->getConfig()->getSuit();
// 结果输出
使用白色背景;使用蓝白气泡.使用蓝色气泡;
使用红色背景;使用红色气泡.使用红色气泡;%