工厂方法属创建型类模式,也称虚构造器/多态性工厂模式,工厂方法使得一个类的实例化延迟到其子类。在简单工厂模式中,产品的创建由静态工厂方法做出判断并返回相应的的对象,缺点就是当我们要添加新的类并希望创建新的对象的时候,我们需要修改静态工厂方法,有没有那种只添加新功能而不修改系统有原有功能的方案呢?当然有了,工厂方法就是一个解决方案。
还是以生产水果为例,静态工厂方法模式中只有一个生产窗口(也就是静态工厂方法),这个生产窗口生产它所能提供的一切水果,如果客户有新需求,就要对该窗口添加新的创建方法,显然要对原系统进行修改;而工厂方法提供的管理模式更加精细化,它会创建许多窗口,每个窗口各施其职,例如生产苹果有生产品苹果的窗口,生产橘子有生产橘子的窗口,如果客户需要的水果不存在,我们只需创建这个水果类以及生产该水果的新窗口即可, 我们并未对原系统中的其他窗口做出任何修改,这对设计模式的“开-闭原则”起到了很好的支持。同样,为了方便起见,这里将所有代码均放到与测试类同一个Java文件中,代码如下:

1 package factoryMethod; 2 public class Test{ 3 private static Creator applecreator,grapecreator; 4 private static Fruit apple,grape; 5 public static void main(String[] args){ 6 applecreator=new AppleCreator(); 7 apple=applecreator.factory(); 8 grapecreator=new GrapeCreator(); 9 grape=grapecreator.factory(); 10 apple.color(); 11 grape.color(); 12 } 13 } 14 interface Creator{ 15 public Fruit factory(); 16 } 17 interface Fruit{ 18 public void taste(); 19 public void color(); 20 } 21 class Apple implements Fruit{ 22 public void taste(){ 23 System.out.println("I'm Sweet"); 24 } 25 public void color(){ 26 System.out.println("I'm Red"); 27 } 28 } 29 class Grape implements Fruit{ 30 31 public void taste(){ 32 System.out.println("I'm Sour"); 33 } 34 public void color(){ 35 System.out.println("I'm Purple"); 36 } 37 } 38 class AppleCreator implements Creator{ 39 public Fruit factory(){ 40 return new Apple(); 41 } 42 }class GrapeCreator implements Creator{ 43 public Fruit factory(){ 44 return new Grape(); 45 } 46 }
代码给出的实例中只有AppleCreator和GrapeCreator两个生产窗口,当我们需要创建新的水果比如橘子时,我们可以添加实现了Fruit接口的橘子类,同时创建一个实现了Creator的新窗口OrangeCreator类,这样生产橘子就只需创建OrangeCreator并调用factory()方法即可,我们并未对原系统代码做任何修改,我们只添加了一些新的类,但是使系统的功能更加强大。
在Java中,实现Collection接口的集合类都包含有一个iterator()方法,该方法返回一个具体的Iterator类对象,这就是工厂方法的一个应用。工厂方法虽然已经完全支持了“开-闭原则”,但其功能还是有限,下次再总结它与抽象工厂的区别。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?