定义:

  • 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。

特点:

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;(优点)
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;(优点)
  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。(缺点)

通常适用场景:

  • 客户只知道创建产品的工厂名,而不知道具体的产品名。
  • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
  • 客户不关心创建产品的细节,只关心产品的品牌。

demo代码:

  • 抽象产品和具体产品 ```java public interface Fruit{ void eat(); }

public class Peach implements Fruit{ @Override public void eat() { System.out.println(“peach”); } }

public class Pear implements Fruit{ @Override public void eat() { System.out.println(“pear”); } }

  1. - 抽象工厂和具体工厂
  2. ```java
  3. public interface FruitFactory {
  4. Fruit make(String name);
  5. }
  6. public class HubeiFruitFactory implements FruitFactory {
  7. @Override
  8. public Fruit make(String name) {
  9. if (name.equals("peach")) {
  10. return new Peach();
  11. } else if (name.equals("pear")) {
  12. return new Pear();
  13. } else {
  14. return null;
  15. }
  16. }
  17. }
  18. public class GuangZhouFruitFactory implements FruitFactory {
  19. @Override
  20. public Fruit make(String name) {
  21. if (name.equals("peach")) {
  22. return new Peach();
  23. } else if (name.equals("pear")) {
  24. return new Pear();
  25. } else {
  26. return null;
  27. }
  28. }
  29. }
  • 测试
    public static void main(String[] args) {
      FruitFactory factory = new HubeiFruitFactory(); //选择一个工厂
      Fruit fruit = factory.make("peach");//不同的工厂造出不一样的对象
    }