抽象工厂模式(abstract Factory Pattern)

上文讲到了工厂模式,这篇文章将抽象工厂,抽象工厂的名字是真的很抽象,也很容易让人抽象的理解,那么什么是抽象工厂呢?

其实抽象工厂,简单来说就是工厂的工厂,因为一般来说一个工厂只负责加载一类组件,那么你有很多小类组件需要生产,那么势必会有很多小类的工厂。那么你最终生产一个大类,那就要很多小类的工厂负责生产。那么如何更方便的管理或者说生产这些工厂呢?那就用生产工厂的工厂来生成吧。

抽象工厂模式的实例

先把上文说的形状工厂搬过来

  1. // 这是之前上文说的形状工厂
  2. class Circle {
  3. draw() {
  4. console.log("I'm a circle")
  5. }
  6. }
  7. class Rectangle {
  8. draw() {
  9. console.log("I'm a rectangle")
  10. }
  11. }
  12. class Square {
  13. draw() {
  14. console.log("I'm a square")
  15. }
  16. }
  17. class ShapeFactory {
  18. getShape(shapeType){
  19. switch(shapeType) {
  20. case 'CIRCLE':
  21. return new Circle();
  22. case 'RECTANGLE':
  23. return new Rectangle();
  24. case 'SQUARE':
  25. return new Square();
  26. default:
  27. return null;
  28. }
  29. }
  30. }

这时候你已经有形状了,但你觉得不美观,你还需要颜色,那么你这个时候,你又搞了个颜色工厂,如下:

  1. // 再新加一个颜色工厂
  2. class Red {
  3. fill() {
  4. console.log("fill red")
  5. }
  6. }
  7. class Blue {
  8. fill() {
  9. console.log("fill blue")
  10. }
  11. }
  12. class Green {
  13. fill() {
  14. console.log("fill green")
  15. }
  16. }
  17. class ColorFactory {
  18. getColor(color){
  19. switch(color) {
  20. case 'RED':
  21. return new Red();
  22. case 'BLUE':
  23. return new Blue();
  24. case 'GREEN':
  25. return new Green();
  26. default:
  27. return null;
  28. }
  29. }
  30. }

颜色工厂好了,但是你担心,以后工厂多了,不好管理咋办,那还是走之前的套路,把工厂通过抽象工厂生产出来。如下:

  1. // 最后添加抽象工厂
  2. class FactoryProducer {
  3. static getFactory(choice){
  4. switch(choice) {
  5. case 'SHAPE':
  6. return new ShapeFactory();
  7. case 'COLOR':
  8. return new ColorFactory();
  9. default:
  10. return null;
  11. }
  12. }
  13. }

那么这个时候和上文一样只需要new出一个抽象工厂,就能把所有需要的东西拿到手了:

  1. //通过抽象工厂拿形状工厂
  2. const shapeFactory = FactoryProducer.getFactory('SHAPE');
  3. // 通过工厂拿各种形状
  4. const shape1 = shapeFactory.getShape('CIRCLE');
  5. shape1.draw();
  6. const shape2 = shapeFactory.getShape('RECTANGLE');
  7. shape2.draw();
  8. const shape3 = shapeFactory.getShape('SQUARE');
  9. shape3.draw();
  10. //通过抽象工厂拿颜色工厂
  11. const colorFactory = FactoryProducer.getFactory('COLOR');
  12. // 通过工厂拿各种颜色
  13. const color1 = colorFactory.getColor('RED');
  14. color1.fill();
  15. const color2 = colorFactory.getColor('BLUE');
  16. color2.fill();
  17. const color3 = colorFactory.getColor('GREEN');
  18. color3.fill();
  19. /**
  20. * output:
  21. * I'm a circle
  22. * I'm a rectangle
  23. * I'm a square
  24. * fill red
  25. * fill blue
  26. * fill green
  27. */

抽象工厂模式的优势

那么使用抽象工厂模式的好处和工厂模式的好处很相似,给工厂做了一个统一的出入口,也方便了日后对这个工厂的修改。

上一页(工厂模式)

下一页(单例模式)