一. 前言 1. 定义 SimpleFactoryPattern:简单工厂模式又叫做静态工厂方法模式(因为工厂类定义了一个静态方法),定义一个用于创建对象的接口,让子类决定实例化哪个类。
Factory Method:工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。
Abstract Factory:抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类。允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
二. 简单工厂模式 1. 概况 背景:一个工厂生产多种产品。
2. 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 public  class  SimpleFactoryPattern           public  interface  Product           void  show ()      }          public  static  class  ProductA  implements  Product           @Override          public  void  show ()               System.out.println("Product A" );         }     }          public  static  class  ProductB  implements  Product           @Override          public  void  show ()               System.out.println("Product B" );         }     }          public  static  class  ProductFactory           public  static  Product createProduct (String type)              Product product = null ;             switch  (type){                 case  "A" :                     product = new  ProductA();                     break ;                 case  "B" :                     product = new  ProductB();                     break ;             }             return  product;         }     }          public  static  void  main (String[] args)                    ProductFactory.createProduct("A" ).show();                  ProductFactory.createProduct("B" ).show();         try  {                          ProductFactory.createProduct("C" ).show();         }catch  (NullPointerException e) {             System.out.println("没有 Product C" );         }     } } 
1 2 3 4 Product A Product B 没有 Product C 
3. 优点 代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。
4. 缺点 
违背开放封闭原则,若需添加新产品则必须修改工厂类逻辑,会造成工厂逻辑过于复杂。
简单工厂模式使用了静态工厂方法,因此静态方法不能被继承和重写。
工厂类包含了所有实例(产品)的创建逻辑,若工厂类出错,则会造成整个系统都会会受到影响。
 
5. 应用场景 生成复杂对象时,确定只有一个工厂类,可以使用简单工厂模式。否则有多个工厂类的话,使用工厂方法模式。
三. 工厂方法模式 1. 概况 背景:有多个工厂,每个工厂只生产一种产品。
2. 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 public  class  FactoryMethodPattern           public  interface  Product           void  show ()      }          public  static  class  ProductA  implements  Product           @Override          public  void  show ()               System.out.println("Product A" );         }     }          public  static  class  ProductB  implements  Product           @Override          public  void  show ()               System.out.println("Product B" );         }     }          public  static  abstract  class  ProductFactory           public  abstract  Product createProduct ()      }          public  static  class  ProductFactoryA  extends  ProductFactory           @Override          public  Product createProduct ()               return  new  ProductA();         }     }          public  static  class  ProductFactoryB  extends  ProductFactory           @Override          public  Product createProduct ()               return  new  ProductB();         }     }          public  static  void  main (String[] args)                    new  ProductFactoryA().createProduct().show();                  new  ProductFactoryB().createProduct().show();     } } 
3. Android系统中的使用 Android中的ThreadFactory就是使用了工厂方法模式来生成线程的,线程就是ThreadFactory的产品。
4. 优点 
符合 开放封闭原则 。新增产品时,只需增加相应的具体产品类和相应的工厂子类即可。 
符合 单一职责原则 。每个具体工厂类只负责创建对应的产品。 
 
5. 缺点 
一个具体工厂只能创建一种具体产品。 
增加新产品时,还需增加相应的工厂类,系统类的个数将成对增加,增加了系统的复杂度和性能开销。 
引入的抽象类也会导致类结构的复杂化。 
 
6. 应用场景 生成复杂对象时,无需知道具体类名,只需知道相应的工厂方法即可。
四. 抽象工厂模式 1. 概况 背景:有多个工厂,每个工厂生产多种产品。
2. 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 public  class  AbstractFactoryPattern           public  interface  CPU           void  showCPU ()      }     public  interface  Memory           void  showMemory ()      }     public  interface  HD           void  showHD ()      }          public  static  class  IntelCPU  implements  CPU           @Override          public  void  showCPU ()               System.out.println("Intel CPU" );         }     }     public  static  class  AmdCPU  implements  CPU           @Override          public  void  showCPU ()               System.out.println("AMD CPU" );         }     }     public  static  class  SanXinMemory  implements  Memory           @Override          public  void  showMemory ()               System.out.println("三星 Memory" );         }     }     public  static  class  KingstonMemory  implements  Memory           @Override          public  void  showMemory ()               System.out.println("金士顿 Memory" );         }     }     public  static  class  XiJieHD  implements  HD           @Override          public  void  showHD ()               System.out.println("希捷 硬盘" );         }     }     public  static  class  XiBuHD  implements  HD           @Override          public  void  showHD ()               System.out.println("西部数据 硬盘" );         }     }          public  static  abstract  class  ComputerFactory           public  abstract  CPU createCPU ()          public  abstract  Memory createMemory ()          public  abstract  HD createHD ()      }          public  static  class  AppleFactory  extends  ComputerFactory           @Override          public  CPU createCPU ()               return  new  IntelCPU();         }         @Override          public  Memory createMemory ()               return  new  SanXinMemory();         }         @Override          public  HD createHD ()               return  new  XiBuHD();         }     }     public  static  class  LianXianFactory  extends  ComputerFactory           @Override          public  CPU createCPU ()               return  new  AmdCPU();         }         @Override          public  Memory createMemory ()               return  new  KingstonMemory();         }         @Override          public  HD createHD ()               return  new  XiJieHD();         }     }          public  static  void  main (String[] args)           System.out.println("--------------------生产苹果电脑-----------------------" );         AppleFactory appleFactory = new  AppleFactory();         appleFactory.createCPU().showCPU();         appleFactory.createMemory().showMemory();         appleFactory.createHD().showHD();         System.out.println("--------------------生产联想电脑-----------------------" );         LianXianFactory lianXianFactory = new  LianXianFactory();         lianXianFactory.createCPU().showCPU();         lianXianFactory.createMemory().showMemory();         lianXianFactory.createHD().showHD();     } } 
1 2 3 4 5 6 7 8 9 --------------------生产苹果电脑----------------------- Intel CPU 三星 Memory 西部数据 硬盘 --------------------生产联想电脑----------------------- AMD CPU 金士顿 Memory 希捷 硬盘 
3. 优点 代码解耦,创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建。
4. 缺点 如果增加新的产品,则修改抽象工厂和所有的具体工厂,违反了 开放封闭原则。
5. 应用场景 生产多个产品组合的对象时。
参考文章 Android的设计模式-简单工厂模式 
简单工厂模式(SimpleFactoryPattern)- 最易懂的设计模式解析 
Android的设计模式-工厂方法模式 
工厂方法模式(Factory Method)- 最易懂的设计模式解析 
Android的设计模式-抽象工厂模式 
抽象工厂模式(Abstract Factory)- 最易懂的设计模式解析