设计模式:简单工厂和工厂方法
简单工厂概念
又叫做静态工厂方法(Static Factory Method)模式,由一个工厂对象决定创建出哪一种产品类的实例。
代码示例
Car是要得到的目标类型,BigCar、MiniCar可能的不同具体的产品,有可能扩展。
CarFactory定义了不同品牌Car的获取方式。
interface Car {
String getBrand();
}
class BigCar implements Car {
@Override
public String getBrand() {
return "Big";
}
}
class MiniCar implements Car {
@Override
public String getBrand() {
return "Mini";
}
}
class CarFactory {
public static Car makeCar(int type) {
switch(type) {
case 1:
return new BigCar();
case 2:
return new MiniCar();
}
return null;
}
}
客户端代码使用CarFactory,传递不同的type获取不同的Car。
void carTest() {
// 获取car的代码-需要作出对不同type的选择
Car car = CarFactory.makeCar(1);
// 使用Car做操作的代码-无需改变
car.getBrand();
}
解读
工厂类是获取产品对象的地方,封装了获取不同产品对象的选择和创建细节。
创建过程得以控制,选择返回不同的产品。
缺点:选择和创建在一起,高内聚。不断修改。
案例
jdbc
Class.forName(String driverClass);
DataManager.getConnection(string url, String user, String pass);
(本文使用Atom编写)
工厂方法概念
定义一个用于创建对象的接口,实现类(子类)决定要实例化的具体对象,使得对要用的类的实例化延迟到子类。
类结构图
代码示例
Car是要得到的目标类型,CarFactory定义了抽象的获取方式。
interface Car {
String getBrand();
}
interface CarFactory {
Car makeCar();
}
BigCar是一种Car,BigCarFactory用来获取它。
class BigCar implements Car {
@Override
public String getBrand() {
return "Big";
}
}
class BigCarFactory implements CarFactory {
@Override
public Car makeCar() {
return new BigCar();
}
}
在通过CarFactory获取Car并使用的代码中,唯一需要变动的地方是“选择哪个工厂类”。
void carTest() {
// 这里选择要使用的CarFactory
CarFactory factory = new BigCarFactory();
// 获取car的代码-无需改变
Car car = factory.makeCar();
// 使用Car做操作的代码-无需改变
car.getBrand();
}
解读?
当需要的产品类型要应对变化时:
使用上,先得到一个工厂——这是唯一需要作出选择的地方,也是可能变化的地方。
把工厂的选择交给调用者代码,而生产哪个产品对象的逻辑是工厂子类决定的。
增加工厂类和产品类,客户端代码本身由于业务变动的起点——唯一需要修改的地方。
符合开闭原则:对扩展开放,对修改关闭。
(本文使用Atom编写)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人