抽象工厂模式:是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

抽象工厂模式的和工厂模式的区别在于:工厂模式是维护某类的实例、而抽象工厂模式是维护某类实例属于那个大类 场景 工厂模式:肯德基里面有炸鸡、有薯条….等等、那我们可以通过工厂模式创建出一个炸鸡实例! 抽象工厂模式:炸鸡里面又细分:孜然味、原味、麻辣味、那通过抽象的形式把都属于炸鸡的维护起来形成一个族类!

  1. // 汽车产品
  2. class BMW{
  3. constructor(){
  4. this.name = '汽车-宝马'
  5. }
  6. run(){
  7. console.log('car---BMW')
  8. }
  9. }
  10. class BENZ{
  11. constructor(){
  12. this.name = '汽车-奔驰'
  13. }
  14. run(){
  15. console.log('car---BENZ')
  16. }
  17. }
  18. // 飞机产品
  19. class Helicopter{
  20. constructor(){
  21. this.name = '飞机-直升飞机'
  22. }
  23. run(){
  24. console.log('aircraft-Helicopter')
  25. }
  26. }
  27. // 抽象工厂类
  28. class AbstrctFactory{
  29. getCar(){
  30. throw new Error('请先实现子类方法')
  31. }
  32. getAircraft(){
  33. throw new Error('请先实现子类方法')
  34. }
  35. }
  36. // 汽车工厂
  37. class Car extends AbstrctFactory{
  38. getCar(type){
  39. switch(type){
  40. case 'bmw':
  41. return new BMW()
  42. case 'benz':
  43. return new BENZ()
  44. default:
  45. break;
  46. }
  47. }
  48. getAircraft(){
  49. return null;
  50. }
  51. }
  52. // 飞机工厂
  53. class Aircraft extends AbstrctFactory{
  54. getAircraft(type){
  55. switch(type){
  56. case 'helicopter':
  57. return new Helicopter()
  58. default:
  59. break;
  60. }
  61. }
  62. getCar(){
  63. return null;
  64. }
  65. }
  66. // 超级工厂类
  67. class SuperFactory{
  68. constructor(type){
  69. switch (type) {
  70. case 'car':
  71. return new Car();
  72. case 'aircraft':
  73. return new Aircraft();
  74. default:
  75. break;
  76. }
  77. }
  78. }
  79. // 根据抽象工厂获得汽车工厂
  80. let car = new SuperFactory('car');
  81. let mbwCar = car.getCar('bmw');
  82. mbwCar.run() // car---BMW
  83. // 根据抽象工厂获得飞机工厂
  84. let aircraft = new SuperFactory('aircraft');
  85. let helicopter = aircraft.getAircraft('helicopter');
  86. helicopter.run() // aircraft-Helicopter

总结

优点

  • 隔离了具体类的生成,使得客户端并不需要知道什么被创建
  • 当产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一产品族中的对象
  • 增加新的产品族很方便,无需修改已有系统代码、符合开闭原则

    缺点

  • 新增新的产品等级结构麻烦,需要对原有系统进行比较大的修改,甚至需要修改抽象层代码,违背了开闭原则

  • 增加了系统的抽象性和理解难度

    适用场景

  • 用户无需关心对象的创建过程,将对象的创建和使用进行解耦!

  • 产品等级结构稳定。在设计完成之后不会向系统新增或者删除产品等级结构

    超级工厂维护了很多产品类、通过超级工厂我们可以获取到具体的产品工厂类、在通过产品工厂类去实例化我们具体需要的项、抽象工厂模式这样让我们对工厂模式做了一个聚合的作用、缺点就是扩展很困难!