0%

设计模式之构建型模式(一):工厂模式

1. 简单工厂模式

  • 概念

    • 让一个工厂类承担构建所有对象的职责
    • 构建对象最常用的方式是 new 一个对象,这是一种硬编码。每 new 一个对象,相当于调用者多知道了一个类,增加了类与类之间的联系,不利于程序的松耦合
  • 优点

    • 封装构建过程,降低耦合,如果某个产品构造方法非常复杂,简单工厂模式还可以减少代码重复
    • 在 GoF 所著的《设计模式》一书中,简单工厂模式被划分为工厂方法模式的一种特例
  • 缺点

    • 如果需要生产的产品过多,简单工厂模式化会导致工厂类过于庞大,承担过多的职责,变成超级类。当多个产品的生产过程需要修改时,都需要修改这个工厂,即这个简单工厂类不止一个引起修改的原因,违背了单一职责原则
    • 当要生产新的产品时,必须在工厂类中添加新的分支,而开闭原则是类应该对修改封闭。我们希望在添加新功能时,只需增加新的类,而不是修改既有的类,违背了开闭原则
  • Demo

    • 水果工厂

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      public class FruitFactory {
      public Fruit create(String type) {
      switch (type) {
      case "苹果":
      AppleSeed appleSeed = new AppleSeed();
      Sunlight sunlight = new Sunlight();
      Water water = new Water();
      return new Apple(appleSeed, sunlight, water);
      case "梨子":
      return new Pear();
      default:
      throw new IllegalArgumentException("暂时没有这种水果");
      }
      }
      }
    • 调用者

      1
      2
      3
      4
      5
      6
      7
      8
      9
      public class User {
      private void eat() {
      FruitFactory fruitFactory = new FruitFactory();
      Fruit apple = fruitFactory.create("苹果");
      Fruit pear = fruitFactory.create("梨子");
      apple.eat();
      pear.eat();
      }
      }

2. 工厂方法模式

  • 概念

    • 为了解决简单工厂模式的违背单一职责原则和违背开闭原则的缺点
    • 工厂方法模式规定每个产品都有一个专属工厂
  • 优点

    • 当生产的产品过多时,工厂类不会变成超级类。工厂类会越来越多,保持灵活,不会越来越大、变得臃肿。如果某个产品的生产过程需要修改时,只需修改对应的工厂类即可,符合单一职责原则
    • 当需要生产新的产品时,无需更改既有的工厂,只需要添加新的工厂即可。保持了面向对象的可扩展性,符合开闭原则
  • 缺点

    • 有几个产品就需要几个工厂类,耦合度没有明显下降
  • Demo

    • 苹果工厂

      1
      2
      3
      4
      5
      6
      7
      8
      public class AppleFactory {
      public Fruit create(){
      AppleSeed appleSeed = new AppleSeed();
      Sunlight sunlight = new Sunlight();
      Water water = new Water();
      return new Apple(appleSeed, sunlight, water);
      }
      }
    • 梨子工厂

      1
      2
      3
      4
      5
      public class PearFactory {
      public Fruit create(){
      return new Pear();
      }
      }
    • 调用者

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public class User {
      private void eat(){
      AppleFactory appleFactory = new AppleFactory();
      Fruit apple = appleFactory.create();
      PearFactory pearFactory = new PearFactory();
      Fruit pear = pearFactory.create();
      apple.eat();
      pear.eat();
      }
      }
-------------------- 本文结束感谢您的阅读 --------------------