23种设计模式-抽象工厂模式
概述
抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级产品的模式结构。
产品族可以理解为,笔记本电脑,台式电脑都是电脑,所以他们算的上一个产品系列
工厂模式里的工厂只生产同种类产品,比如汽车厂只生产汽车,但生活中很多工厂都是综合型的工厂,能生产不同种类的产品,比如电器厂既生产电视机又生产洗衣机等
结构
抽象工厂模式的主要角色如下:
- 抽象工厂: 提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
- 具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品:定义了产品规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品:实现了抽象产品所定义的接口,由具体国产来创建,它同具体工厂之间是多对一的关系。
实现
/**
* 抽象工厂
*/
interface AbstractFactory
{
public function createMobile();
public function createComputer();
}
/**
* 抽象产品
*/
interface Mobile
{
public function getName();
}
/**
* 抽象产品
*/
interface Computer
{
public function boot();
}
/**
* 具体产品
*/
class RedmiK70 implements Mobile
{
public function getName()
{
return '红米K70';
}
}
/**
* 具体产品
*/
class RedmiBook implements Computer
{
public function boot()
{
return '红米笔记本开机';
}
}
/**
* 具体产品
*/
class HuaweiNova12 implements Mobile
{
public function getName()
{
return '华为Nova12';
}
}
/**
* 具体产品
*/
class XiaoxinBook implements Computer
{
public function boot()
{
return '小心笔记本启动';
}
}
/**
* 华为系工厂
* 生产华为品牌产品,包含手机和电脑
*/
class Huawei implements AbstractFactory
{
public function createMobile():Mobile
{
return new HuaweiNova12();
}
public function createComputer():Computer
{
return new XiaoxinBook();
}
}
/**
* 小米系工厂
* 生产小米品牌产品,包含手机和电脑
*/
class Xiaomi implements AbstractFactory
{
public function createMobile():Mobile
{
return new RedmiK70();
}
public function createComputer():Computer
{
return new RedmiBook();
}
}
优缺点
优点:当一个产品系列中的多个对象呗设计成一起工作时,它能保证客户端始终只使用同一个产品系列的对象
缺点:当产品系列需要新增一个产品时,所有的工厂类都需要修改
使用场景
- 当需要创建的对象是一系列相互关联或相互依赖的产品系列时,如小米工厂中的手机、电脑等
- 系统中有多个产品系列,但每次只使用其中的某一系列产品,如有人只喜欢买小米品牌的产品
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构