抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。)

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

3.1、场景示例

例如在简单工厂模式中,我们创建了不同颜色的书籍,红书,绿书,以及蓝书,随着工厂的日益增长,书店讨论创建分店,一个店卖IT技术类书籍,一类专门卖小说。这个时候我们简单工厂就不太方便实现这种需求了,所以抽象工厂模式来了。

3.2、代码分析

因为有了新的产品,所以基于书店的模式,我们需要对书籍作出调增,如下:

3、抽象工厂模式(AbstractFactoryPattern) - 图1 基于上面的修改,其代码如下:

  1. abstract class Book {
  2. abstract String getType();
  3. abstract String getColor();
  4. abstract Float getPrice();
  5. }
  6. abstract class RedBook extends Book {
  7. @Override
  8. String getColor() {
  9. return "RED";
  10. }
  11. }
  12. abstract class GreenBook extends Book {
  13. @Override
  14. String getColor() {
  15. return "GREEN";
  16. }
  17. }
  18. // 具体书籍实现
  19. class RedITBook extends RedBook {
  20. @Override
  21. String getType() {
  22. return "IT";
  23. }
  24. @Override
  25. Float getPrice() {
  26. return 123F;
  27. }
  28. }
  29. class RedStoreBook extends RedBook {
  30. @Override
  31. String getType() {
  32. return "Store";
  33. }
  34. @Override
  35. Float getPrice() {
  36. return 3243.43F;
  37. }
  38. }
  39. // 蓝色的书籍
  40. class BlueITBook extends RedBook {
  41. @Override
  42. String getType() {
  43. return "IT";
  44. }
  45. @Override
  46. Float getPrice() {
  47. return 123F;
  48. }
  49. }
  50. class BlueStoreBook extends RedBook {
  51. @Override
  52. String getType() {
  53. return "Store";
  54. }
  55. @Override
  56. Float getPrice() {
  57. return 3243.43F;
  58. }
  59. }

工厂新增创建ITFactory 以及 StoreFactory

  1. interface Factory {
  2. Book createRedBook();
  3. Book createBlueBook();
  4. }
  5. class ITBookFactory implements Factory {
  6. @Override
  7. public Book createRedBook() {
  8. return new RedITBook();
  9. }
  10. @Override
  11. public Book createBlueBook() {
  12. return new BlueITBook();
  13. }
  14. }
  15. class StoreBookFactory implements Factory {
  16. @Override
  17. public Book createRedBook() {
  18. return new RedStoreBook();
  19. }
  20. @Override
  21. public Book createBlueBook() {
  22. return new BlueStoreBook();
  23. }
  24. }

3.3、总结

  • 封闭性,每个产品的实现类不是高层模块要关心的
  • 产品族内的约束为非公开状态,例如,在书籍的比例上,上层代码不需要了解,仅由内部控制
  • 抽象工厂模式拓展产品族困难,比如新增了紫色书籍,对应的 ITBookFactoryStoreBookFactory 均需要修改,违反了开闭原则。
  • 从上面的UML类图中可以看到如果新增一个英文书籍,是非常方便的,只需要创建 RedEngishBook extends RedBookBlueEnglishBook extends BlueBook 以及 EnglishFactory implement Factory 即可,没有对其他代码进行修改,符合开闭原则。