Factory pattern(工厂方法模式)
工厂模式概念:
- 实例化对象,用工厂方法代替new操作
- 工厂模式包括工厂方法模式和抽象工厂模式
- 抽象工厂模式是工厂方法模式的扩展
两种工厂模式具体定义:
- 简单工厂(简单工厂不是设计模式而是编程习惯,有些人误以为是“工厂模式”):将共性的算法抽取,进行抽象定义在一个类作为工厂类,工厂类根据参数化方法来实例化对象
- 工厂方法模式(Factory Mode):定义一个用于创建对象的接口,让子类来决定实例化的类是哪一个。工厂方法将类实例化延迟到子类
- 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类
工厂方法模式
工厂方法模式特点
- 特点: 创建与使用解耦
- 关键代码:创建过程在子类执行
- 使用场景:不同条件下创建不同实例时
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
工厂方法模式类图
- 抽象工厂(Factory):提供创建产品的接口,调用者通过它访问具体工厂的工厂方法factoryMethod()来创建指定产品。
- 具体工厂(ConcreteFactory):实现抽象工厂的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义产品的规范,描述产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,由具体工厂来创建,与具体工厂一一对应。
简单工厂和工厂方法之间的差异: 简单工厂将全部的事情放在一个地方处理完;工厂方法创建一个框架,让子类决定要如何实现(将对象实例化延迟到子类), 简单工厂不具备工厂方法的弹性无法变更正在创建的产品
实例01:汽车工厂(简单工厂模式)
类图
实例代码
// 产品类 abstract class Car{ public String name; public String color; Car(String _name, String _color){ this.name = _name; this.color = _color; } abstract void getInfo(); } class BenzCar extends Car{ public BenzCar(String _name, String _color){ super(_name, _color); } @Override void getInfo() { System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color); } } class BMWCar extends Car{ public BMWCar(String _name, String _color){ super(_name, _color); } @Override void getInfo() { System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color); } } // 简单工厂类 class SimpleCarFactory{ /** * carName: 车名称 * color: 车的颜色 * type: 汽车品牌 */ @Override public Car getCar(String carName, String color, String type) { // 参数化工厂方法: 根据传入的参数创建不同的对象 if("Benz".equals(type)){ return new BenzCar(carName, color); }else if ("BMW".equals(type)){ return new BMWCar(carName, color); }else{ System.out.println("No matching type!"); return null; } } } public class FactoryPatterDemoSpace { public static void main(String[] args) { SimpleCarFactory carFactory = new SimpleCarFactory(); Car car = carFactory.getCar("奔驰", "黑色", "Benz"); car.getInfo(); // 汽车品牌:奔驰 ,汽车颜色: 黑色 } }
实例02:汽车工厂(工厂方法模式)
类图
实例代码
// 产品类 abstract class Car{ public String name; // 汽车名称 public String color; // 汽车颜色 Car(String _name, String _color){ this.name = _name; this.color = _color; } abstract void getInfo(); } // 产品具体类 class BenzCarInGermany extends Car{ public BenzCarInGermany(String _name, String _color){ super(_name, _color); } @Override void getInfo() { System.out.println("汽车名称:" + this.name + " ,汽车颜色: " + this.color + " ,汽车配置来源:德国🇩🇪-Germany"); } } // 产品具体类 class BenzCarInChina extends Car{ public BenzCarInChina(String _name, String _color){ super(_name, _color); } @Override void getInfo() { System.out.println("汽车名称:" + this.name + " ,汽车颜色: " + this.color + " ,汽车配置来源:中国🇨🇳-China"); } } // 产品具体类 class BMWCarInGermany extends Car{ public BMWCarInGermany(String _name, String _color){ super(_name, _color); } @Override void getInfo() { System.out.println("汽车名称:" + this.name + " ,汽车颜色: " + this.color + " , 汽车配置来源:德国🇩🇪-Germany" ); } } // 产品具体类 class BMWCarInChina extends Car{ public BMWCarInChina(String _name, String _color){ super(_name, _color); } @Override void getInfo() { System.out.println("汽车名称:" + this.name + " ,汽车颜色: " + this.color + " , 汽车配置来源:中国🇨🇳-China" ); } } // 工厂类 interface CarFactory{ Car createCar(String carName, String color, String place); } // 工厂子类用来决定实例化对象的类具体是哪一个(工厂方法模式将类实例化延迟到子类) class BenzCarFactory implements CarFactory{ /** * @param carName 汽车名称 * @param color 汽车颜色 * @param place 汽车配置来源地 * */ @Override public Car createCar(String carName, String color, String place) { if("Germany".equals(place)){ return new BenzCarInGermany(carName, color); }else if("China".equals(place)){ return new BenzCarInChina(carName, color); }else{ System.out.println("暂无!"); return null; } } } public class FactoryPatterDemoSpace { public static void main(String[] args) { CarFactory carFactory = new BenzCarFactory(); Car car01 = carFactory.createCar("奔驰233", "黑色", "China"); car01.getInfo(); // 汽车名称:奔驰233 ,汽车颜色: 黑色 ,汽车配置来源:中国🇨🇳-China Car car02 = carFactory.createCar("奔驰666", "蓝色", "Germany"); car02.getInfo(); // 汽车名称:奔驰666 ,汽车颜色: 蓝色 ,汽车配置来源:德国🇩🇪-Germany } }
参考:https://www.runoob.com/design-pattern/factory-pattern.html
学而不思则罔,思而不学则殆!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具