简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法),负责生产一类对象。

简单工厂的组成模型如下:

组成 关系 作用
抽象产品(Product) 具体产品的父类 提供描述产品的公共接口
具体产品(Concrete Product) 具体产品类,工厂生产的目标类 具体产品
工厂(Factory) 外界调用 根据不同的入参创建不同的产品类实例

简单工厂模式要解决的问题

将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。即使用者可直接消费产品而不需要知道其生产的细节。
**

简单工厂模式的优点

  1. 创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
  2. 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程


简单工厂模式的缺点

  1. 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
  2. 违背“开闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂;
  3. 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构

简单工厂模式应用场景

  1. 客户如果只知道传入工厂类的参数,不关心创建对象的逻辑;
  2. 工厂类负责创建的对象(具体产品)比较少

简单工厂模式实现步骤

  1. 创建产品抽象类,提供具体产品的公共接口;
  2. 创建具体产品类,继承至抽象类,实现接口;
  3. 创建工厂类,根据不同的入参创建不同的具体产品;
  4. 外界调用工厂类的静态方法,传入不同的入参,创建出不同的产品;

简单工厂模式使用示例

使用简单工厂模式生产不同的Pencil。

  1. public class SimpleFactory {
  2. /**
  3. * 抽象产品类,并定义具体产品的基本功能
  4. */
  5. public interface IPencil {
  6. void write();
  7. }
  8. /**
  9. * 具体产品类:钢笔
  10. */
  11. public static class Fountain implements IPencil {
  12. @Override
  13. public void write() {
  14. System.out.println("使用钢笔写字");
  15. }
  16. }
  17. /**
  18. * 具体产品类:铅笔
  19. */
  20. public static class Pencil implements IPencil {
  21. @Override
  22. public void write() {
  23. System.out.println("使用铅笔写字");
  24. }
  25. }
  26. /**
  27. * 具体产品类:毛笔
  28. */
  29. public static class WritingBrush implements IPencil {
  30. @Override
  31. public void write() {
  32. System.out.println("使用毛笔写字");
  33. }
  34. }
  35. /**
  36. * 具体产品生产工厂
  37. */
  38. public static class PenFactory {
  39. public static IPencil createPencil(Class<? extends IPencil> clazz) {
  40. try {
  41. Constructor<? extends IPencil> declaredConstructor = clazz.getDeclaredConstructor();
  42. return declaredConstructor.newInstance();
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. return null;
  47. }
  48. }
  49. public static void main(String[] args) {
  50. // 生产铅笔
  51. PenFactory.createPencil(Pencil.class).write();
  52. // 生产钢笔
  53. PenFactory.createPencil(Fountain.class).write();
  54. // 生产毛笔
  55. PenFactory.createPencil(WritingBrush.class).write();
  56. }
  57. }

结果输出:

:::success 使用铅笔写字
使用钢笔写字
使用毛笔写字 :::