设计模式--工厂方法
简介
在简单工厂方法中,当增加新的产品时需要对简单工厂类修改或者创建多个简单工厂类。工厂方法进一步的解耦,把工厂类抽象,不再负责所有实例的创建,而是把具体的创建工作交给子类去完成,实例化延迟到子类加载,由子类决定要实例化的类
工厂方法的核心是一个抽象工厂类,而不像简单工厂模式,把核心放在一个实类上
- 抽象产品角色(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"); } }
- 产品A类
- 工厂接口
-
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(); } }
- 产品A工厂类
- 测试
-
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()
识别方法: 工厂方法可通过构建方法来识别, 它会创建具体类的对象, 但以抽象类型或接口的形式返回这些对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南