抽象工厂模式是一种工厂方法模式的扩展,它可以用于创建一系列相关或依赖对象的组合,而无需指定它们的具体类。这个模式的主要目的是封装一组对象的创建过程,使之与客户端分离,客户端只需要知道所需要的产品的抽象类型。
举个例子来说明,假设我们正在开发一款电子设备,包括手机和平板电脑。同时,我们想要在不同市场中发行这款设备,例如中国市场和美国市场。这两个市场的电子设备有些不同,需要分别创建不同的设备。抽象工厂模式提供的是两个抽象工厂,即中国市场工厂和美国市场工厂,它们会分别生产符合各自市场要求的手机和平板电脑。
以下从多个角度阐述抽象工厂模式:
1.结构
抽象工厂模式由抽象工厂、具体工厂、抽象产品和具体产品组成,其中:
- 抽象工厂:定义了一组可以创建不同产品的抽象方法;
- 具体工厂:继承抽象工厂并实现其中的抽象方法;
- 抽象产品:定义了所创建的产品的抽象类或接口;
- 具体产品:实现抽象产品中定义的方法。
2.优缺点
抽象工厂模式的优点:
- 可以保证客户端只使用一份代码,避免重复的工作;
- 利用一个工厂来生产一组产品来保证这些产品在一起使用;
- 提供了系统的稳定性;
- 可以和其他设计模式组合使用,如装饰器模式、单例模式、观察者模式等。
抽象工厂模式的缺点:
- 扩展困难,无法支持新种类的产品添加到系统中;
- 代码复杂度增加,需要定义很多的类和接口。
3.两个案例
3.1 同时支持多种数据库类型
假设我们正在实现一个电子商务网站,该网站需要支持多种数据库,包括MySQL和Oracle。同时,我们还需要支持两种不同的数据操作方式,一个是读写分离,另一个是主从复制。使用抽象工厂模式可以将代码分为以下几个部分:
- 抽象工厂类:定义了创建连接对象和命令对象的抽象方法。
- 具体工厂类MySQLFactory和OracleFactory:实现抽象工厂类中的创建对象方法,用于创建连接对象和命令对象。
- 抽象产品类:定义了执行SQL命令的抽象方法。
- 具体产品类MySQLCommand和OracleCommand:实现抽象产品类中的执行SQL命令的方法。
3.2 制作奶茶
现在有一家奶茶店,这家店需要根据顾客的口味和需求制作不同口味的奶茶,例如可选的茶叶种类包括绿茶、红茶、乌龙茶等,可选的味道包括原味、草莓味、香草味、奶香味等。可以利用抽象工厂模式将制作奶茶的过程分为以下几个部分:
- 抽象工厂类:定义了创建茶叶、奶和甜味剂的抽象方法。
- 具体工厂类GreenTeaFactory、BlackTeaFactory和OolongTeaFactory:实现抽象工厂类中的创建茶叶和奶的方法。
- 抽象产品类:定义了添加甜味剂和制作奶茶的抽象方法。
- 具体产品类StrawberryMilkTea、VanillaMilkTea、OriginalMilkTea和MilkTeaWithMilk:实现抽象产品类中的添加甜味剂和制作奶茶的方法。
扫码咨询 领取资料