设计模式-抽象工厂模式

文章目录

一、详解

  • 概念: 定义一个抽象工厂接口 ,根据传入的类型 创建对应的工厂,进而创建一组相关的对象
  • 主要用途:有多于一个的产品族,根据类型选择某一组的产品
  • 代码:多组产品接口、子类和工厂、抽象工厂、产品组选择器

二、代码

  • 源码:https://gitee.com/deschen/designPattern-study

  • 多组产品接口、子类和工厂

    • 交通工具类

      java 复制代码
      public interface Transport {
      
          void drive();
      }
      
      // 子类
      public class Bicycle implements Transport {
      
          @Override
          public void drive() {
              System.out.println("Driving a bicycle.");
          }
      }
      public class Car implements Transport {
      
          @Override
          public void drive() {
              System.out.println("Driving a car.");
          }
      }
      public class Plane implements Transport {
      
          @Override
          public void drive() {
              System.out.println("Driving a plane.");
          }
      }
      
      // 工厂
      public class TransportFactory extends AbstractFactory{
      
          @Override
          public Transport createTransport(String type) {
              switch (type) {
                  case "car":
                      return new Car();
                  case "bicycle":
                      return new Bicycle();
                  case "plane":
                      return new Plane();
                  default:
                      throw new IllegalArgumentException("Invalid transport type: " + type);
              }
          }
      
          @Override
          public Animal createAnimal(String type) {
              return null;
          }
      
      }
    • 动物类

      java 复制代码
      public interface Animal {
      
          void run();
      }
      
      //子类
      public class Bird implements Animal {
          @Override
          public void run() {
              System.out.println("Bird fly.");
          }
      }
      public class Cat implements Animal {
      
          @Override
          public void run() {
              System.out.println("Cat run.");
          }
      }
      public class Fish implements Animal {
          @Override
          public void run() {
              System.out.println("Fish swim.");
          }
      }
      
      // 工厂
      public class AnimalFactory extends AbstractFactory{
      
          @Override
          public Transport createTransport(String type) {
              return null;
          }
      
          @Override
          public Animal createAnimal(String type) {
              switch (type) {
                  case "cat":
                      return new Cat();
                  case "bird":
                      return new Bird();
                  case "fish":
                      return new Fish();
                  default:
                      throw new IllegalArgumentException("Invalid animal type: " + type);
              }
          }
      
      }
  • 抽象工厂

    java 复制代码
    public abstract class AbstractFactory {
    
        public abstract Transport createTransport(String type);
    
        public abstract Animal createAnimal(String type);
    }
  • 产品组选择器

    java 复制代码
    public class FactorySelector {
    
        public static AbstractFactory getFactory(String type) {
            switch (type) {
                case "transport":
                    return new TransportFactory();
                case "animal":
                    return new AnimalFactory();
                default:
                    throw new IllegalArgumentException("Invalid factory type: " + type);
            }
        }
    }
  • 用例

    java 复制代码
    public class Demo {
    
        public static void main(String[] args) {
            // 选择交通工具工厂
            AbstractFactory transportFactory = FactorySelector.getFactory("transport");
    
            // 创建汽车
            Transport car = transportFactory.createTransport("car");
            car.drive();
    
            // 创建自行车
            Transport bicycle = transportFactory.createTransport("bicycle");
            bicycle.drive();
    
            // 创建飞机
            Transport plane = transportFactory.createTransport("plane");
            plane.drive();
    
            System.out.println("========================");
            // 选择动物工厂
            AbstractFactory animalFactory = FactorySelector.getFactory("animal");
    
            // 创建猫
            Animal cat = animalFactory.createAnimal("cat");
            cat.run();
    
            // 创建鸟
            Animal bird = animalFactory.createAnimal("bird");
            bird.run();
    
            // 创建鱼
            Animal fish = animalFactory.createAnimal("fish");
            fish.run();
        }
    }
    
    // 输出
    Driving a car.
    Driving a bicycle.
    Driving a plane.
    ========================
    Cat run
    Bird fly.
    Fish swim.
相关推荐
专注VB编程开发20年14 分钟前
C#全面超越JAVA,主要还是跨平台用的人少
java·c#·.net·跨平台
南_山无梅落31 分钟前
9.Python3集合(set)增删改查和推导式
java·开发语言
爱笑的眼睛111 小时前
超越MSE与交叉熵:深度解析损失函数的动态本质与高阶设计
java·人工智能·python·ai
全靠bug跑1 小时前
Spring Cloud OpenFeign 实战三部曲:快速集成 · 连接池优化 · 客户端抽取
java·spring boot·openfeign
Evan芙1 小时前
搭建nexus服务,实现本地仓库、代理仓库
java·nginx·tomcat
乂爻yiyao2 小时前
Java LTS版本重要升级特性对照表
java·开发语言
原来是好奇心2 小时前
深入Spring Boot源码(六):Actuator端点与监控机制深度解析
java·开发语言·源码·springboot
叠叠乐2 小时前
robot_state_publisher 参数
java·前端·算法
过期动态2 小时前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql