设计模式 03 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)属于创建型模式
概述
抽象工厂模式是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。前面的工厂模式通过定义顶层抽象工厂类,通过继承的方式,针对于每一个产品都提供一个工厂类用于创建。
不过这种模式只适用于简单对象,当需要生产许多个产品族的时候,这种模式就有点乏力了,比如:
实际上这些产品都是成族出现的,比如小米的产品线上有小米手机、小米平板等,华为的产品线上也有华为手机、华为平板。如果按照之前的工厂模式来进行设计,那就需要单独设计 9 个工厂来生产上面这些产品,显然这样就比较浪费时间的。
这时可以使用抽象工厂模式,将多个产品都放在一个工厂中进行生成,按不同的产品族进行划分。比如小米,那么就创建一个小米工厂,这个工厂里面可以生产整条产品线上的内容,包括小米手机、小米平板等。
代码实现
这里以小米工厂和华为工厂生产设备为例介绍抽象工厂模式:
1、创建产品接口
/**
* 手机
*/
public interface Phone {
/**
* 打电话
*/
void call();
}
/**
* 平板
*/
public interface Pad {
/**
* 看视频
*/
void video();
}
2、定义具体产品
/**
* 小米手机
*/
public class XiaoMiPhone implements Phone {
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
/**
* 小米平板
*/
public class XiaoMiPad implements Pad {
@Override
public void video() {
System.out.println("小米平板看视频");
}
}
/**
* 华为手机
*/
public class HuaWeiPhone implements Phone {
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
/**
* 华为平板
*/
public class HuaWeiPad implements Pad {
@Override
public void video() {
System.out.println("华为平板看视频");
}
}
3、创建抽象工厂
/**
* 抽象工厂
*/
public abstract class AbstractFactory {
/**
* 获取手机
* @return 手机对象
*/
public abstract Phone getPhone();
/**
* 获取平板
* @return 平板对象
*/
public abstract Pad getPad();
}
4、创建品牌工厂
/**
* 小米工厂
*/
public class XiaoMiFactory extends AbstractFactory{
@Override
public Phone getPhone() {
return new XiaoMiPhone();
}
@Override
public Pad getPad() {
return new XiaoMiPad();
}
}
/**
* 华为工厂
*/
public class HuaWeiFactory extends AbstractFactory {
@Override
public Phone getPhone() {
return new HuaWeiPhone();
}
@Override
public Pad getPad() {
return new HuaWeiPad();
}
}
5、生产使用
// 小米手机
Phone xiaomiPhone = new XiaoMiFactory().getPhone();
// 华为手机
Phone huaweiPhone = new HuaWeiFactory().getPhone();
// 小米平板
Pad xiaoMiPad = new XiaoMiFactory().getPad();
// 华为平板
Pad huaweiPad = new HuaWeiFactory().getPad();
// 输出测试
xiaomiPhone.call();
huaweiPhone.call();
xiaoMiPad.video();
huaweiPad.video();
输出结果为:
小米手机打电话
华为手机打电话
小米平板看视频
华为平板看视频
如此即实现了各工厂生产不同产品族的产品并实现对应的功能。一个工厂可以生产同一个产品族的所有产品,这样按族进行分类,显然比之前的工厂模式更好。
不过,缺点还是有的,如果产品族新增了产品,那么我就不得不去为每一个产品族的工厂都去添加新产品的生产方法,违背了开闭原则。且这种模式需要使用的类远多于工厂模式,除非是类似这种产品族的业务场景,否则还是更推荐工厂模式实现。
优缺点
优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景
1、QQ 换皮肤,一整套一起换。
2、生成不同操作系统的程序。
注意事项
产品族难扩展,产品等级易扩展。
参考
https://www.bilibili.com/video/BV1mc411h719?p=4&vd_source=299f4bc123b19e7d6f66fefd8f124a03