设计模式--工厂方法

简介

在简单工厂方法中,当增加新的产品时需要对简单工厂类修改或者创建多个简单工厂类。工厂方法进一步的解耦,把工厂类抽象,不再负责所有实例的创建,而是把具体的创建工作交给子类去完成,实例化延迟到子类加载,由子类决定要实例化的类

工厂方法的核心是一个抽象工厂类,而不像简单工厂模式,把核心放在一个实类上

  • 抽象产品角色(Product):定义产品的接口或者抽象类
  • 具体产品角色(ProductA/ProductB) :实现接口Product的具体子产品类
  • 抽象工厂角色(Facotry) :声明工厂方法(display()),返回一个产品
  • 真实的工厂(ProductAFactory/ProductBFactory):实现工厂方法(display()),由客户端调用,返回一个子产品的实例

实现

  • 产品接口
    • public interface Product {
          void display();
      }
  • 产品接口实现子类
    • 产品A类
      public class ProductA implements Product{
          @Override
          public void display() {
              System.out.println("This is product A");
          }
      }
    • 产品B类
      public class ProductB implements Product{
          @Override
          public void display() {
              System.out.println("This is product B");
          }
      }
  • 工厂接口
    • public interface Factory {
      
          Product createProduct();
      }
  • 工厂接口的实现子类
    • 产品A工厂类
      public class ProductAFactory implements Factory{
          @Override
          public Product createProduct() {
              return new ProductA();
          }
      }
    •  产品B工厂类
      public class ProductBFactory implements Factory{
      
          @Override
          public Product createProduct() {
              return new ProductB();
          }
      }
  • 测试
    • public class Test {
          public static void main(String[] args) {
              Product productA = new ProductAFactory().createProduct();
              Product productB = new ProductBFactory().createProduct();
              productA.display();
              productB.display();
          }
      }
      This is product A
      This is product B

优势和缺点

优势

  • 工厂方法模式对客户端隐藏了具体产品类被实例化细节,甚至无须知道具体产品类的类名,只需要关心所需产品对应的工厂
  • 加入新产品时,只要添加一个具体工厂和具体产品就可以了,无需修改原先已有的产品和其他工厂方法。提高了系统的可扩展性,符合“开闭原则”

缺点:

  • 加入新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度

应用场景

  • 一个类无需知道它所需要的具体的对象类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂类即可,具体产品对象由具体工厂类创建
  • 一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于父工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,提高系统的可扩展性

Java 中应用实例

Java 程序库中有该模式的应用

  • java.util.Calendar#getInstance()

识别方法 工厂方法可通过构建方法来识别 它会创建具体类的对象 但以抽象类型或接口的形式返回这些对象

posted @   伊文小哥  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示