根据输入的不同返回不同类的实例,一般用来创建同一类对象。工厂方式的主要思想是将对象的创建与对象的实现分离。

运动工厂

场景:我想获得运动类目的信息、但是我不需要去管这些信息是怎么制定的由谁制定的、我只需要通过

  1. // 篮球类
  2. class Basketball{
  3. constructor(name){
  4. this.name = name
  5. }
  6. getMember(){
  7. console.log('每一只队伍需要五个人,球名称:' + this.name)
  8. }
  9. }
  10. // 足球类
  11. class Football{
  12. constructor(name){
  13. this.name = name
  14. }
  15. getMember(){
  16. console.log('每一只队伍需要11个人,球名称:' + this.name)
  17. }
  18. }
  19. // 网球
  20. class Tennis{
  21. constructor(name){
  22. this.name = name
  23. }
  24. getMember(){
  25. console.log('每一只队伍需要1个人,球名称:' + this.name)
  26. }
  27. }
  28. // 运动工厂
  29. class SportsFactory{
  30. static create(type, name){
  31. switch(type){
  32. case 'NBA':
  33. return new Basketball(name)
  34. case 'WordCup':
  35. return new Football(name)
  36. case 'FrenchOpen':
  37. return new Tennis(name)
  38. }
  39. }
  40. }
  41. const basketball = SportsFactory.create('NBA','花球')
  42. basketball.getMember()
  43. const sportsFactory = SportsFactory.create('WordCup','蓝色足球')
  44. sportsFactory.getMember()
  45. /*
  46. 这里解释下为什么使用一个暴露类通过静态方法的方式去按type去创建对应的类、
  47. 主要还是因为当一个不知道你这个方法的人人家不知道是通过new 还是直接执行的方式创建类、索性直接
  48. 通过类的静态方法统一
  49. */

总结

优点
  • 解藕,将对象的创建和使用进行分离
  • 降低代码重复

    缺点
  • 职责过重,一旦程序出错,整个系统不能运行

  • 违反了开闭原则,一旦新增产品必须修改原有代码

    适用场景

  • 客户端不需要知道他需要的对象类的实现

  • 抽象工厂类通过其子类来指定创建哪个对象。利用面向对象的多态性和里氏替换原则,在程序运行时子类覆盖父类对象,从而使得系统更容易扩展