工厂方法模式(Factory Method Pattern),是简单工厂模式的扩展,定义一个创建对象的接口,但是让子类来觉得该实例化那个类。工厂方法让一个类推迟实例化至它的子类中。工厂方法模式有四个角色:
抽象工厂(Creator)角色:这是工厂方法模式的核心,具体工厂角色必须实现这个接口才能创建对象。
具体工厂(Concrete Creator)角色:实现了抽象工厂角色的接口,实现了抽象工厂,用具具体产品的创建。
抽象产品(Product)角色:定义了产品的共性,实现对产品最抽象的定义。
具体产品(Concrete Product)角色:实现抽象产品角色的接口。工厂方法所创建的对象就是该角色的实例。
工厂方法模其类图如下:
抽象工厂的代码模式:
public abstract class AbstractComputerFactory { /** * 创建计算机抽象方法 * * @param tClass * @param <T> 泛型类 * @return */ public abstract <T extends AbstractComputer> T createComputer(Class<T> tClass); }
抽象产品的代码模式:
/** * 抽象计算机类 */ public abstract class AbstractComputer { /** * 抽象方法 * * @param info */ public abstract void printInfo(String info); }
具体工厂的代码模式:
@Component public class ComputerFactory extends AbstractComputerFactory { /** * 创建计算机抽象方法 * * @param tClass * @param <T> 泛型类 * @return */ public <T extends AbstractComputer> T createComputer(Class<T> tClass) { AbstractComputer computer = null; try { computer = (AbstractComputer) tClass.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) computer; } }
具体产品的代码模式:
此处生产两种不同的产品,Apple和ThinkPad
/** * 苹果笔记本 */ @Component public class AppleComputer extends AbstractComputer { /** * 输出 * * @param info */ public void printInfo(String info) { System.out.println(info); } }
/** * ThinkPad 笔记本 */ @Component public class ThinkPadComputer extends AbstractComputer { /** * 输出 * * @param info */ public void printInfo(String info) { System.out.println(info); } }
测试:
@SpringBootTest class AbstractComputerFactoryTest { @Autowired private AbstractComputerFactory computerFactory; @Test void showComputerInfo() { AbstractComputer thinkPadComputer = computerFactory.createComputer(ThinkPadComputer.class); AbstractComputer appleComputer = computerFactory.createComputer(AppleComputer.class); thinkPadComputer.printInfo("这是 ThinkPad 笔记本。"); appleComputer.printInfo("这是 Apple 笔记本。"); } }
工厂方法模式就是由具体的工厂生产具体的产品,当增加新产品时,只需增加一个新工厂即可。
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决