欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【设计模式】工厂模式

【设计模式】工厂模式

2025/4/3 15:57:17 来源:https://blog.csdn.net/liberalliushahe/article/details/146818509  浏览:    关键词:【设计模式】工厂模式

在开发程序的过程中不可避免的要创建很多的对象,如果直接新建对象,那么一旦代码涉及修改就要改动很多的地方。用一个工厂来生产对象,使用者只需要告诉工厂我需要什么,由工厂负责创建,使用者并不关心具体细节。就比如你去餐厅点餐,只需要告诉服务员你想吃什么,厨房会根据你的诉求制作相应的菜品,而你并不需要关系这道菜是怎么做的,用了什么材料。工厂模式的核心就是将对象的创建和使用分离,让代码更加灵活,更容易维护。

案例代码(简单工厂模式)

// 1. 定义产品接口
interface Car {void drive();
}// 2. 实现具体产品
class ToyotaCar implements Car {@Overridepublic void drive() {System.out.println("驾驶丰田车...");}
}class HondaCar implements Car {@Overridepublic void drive() {System.out.println("驾驶本田车...");}
}// 3. 创建工厂(决定生产哪种车)
class CarFactory {public static Car createCar(String type) {if ("Toyota".equals(type)) {return new ToyotaCar();} else if ("Honda".equals(type)) {return new HondaCar();}throw new IllegalArgumentException("未知车型");}
}// 4. 使用工厂
public class Main {public static void main(String[] args) {Car car = CarFactory.createCar("Toyota");car.drive(); // 输出:驾驶丰田车...}
}

工厂方法模式(进阶)

// 1. 抽象工厂接口
interface CarFactory {Car createCar();
}// 2. 每个品牌有自己的工厂
class ToyotaFactory implements CarFactory {@Overridepublic Car createCar() {return new ToyotaCar();}
}class HondaFactory implements CarFactory {@Overridepublic Car createCar() {return new HondaCar();}
}// 3. 使用
public class Main {public static void main(String[] args) {CarFactory factory = new ToyotaFactory();Car car = factory.createCar();car.drive(); // 输出:驾驶丰田车...}
}

实际案例
支付网关集成
场景:
支持支付宝、微信支付等多种支付方式,动态切换支付接口实现。
工厂模式应用:
通过工厂类根据参数创建对应的支付处理器实例。
参考代码:

// 1. 支付接口
interface Payment {void pay(double amount);
}// 2. 具体支付实现
class Alipay implements Payment {@Overridepublic void pay(double amount) {System.out.println("支付宝支付: " + amount);}
}class WechatPay implements Payment {@Overridepublic void pay(double amount) {System.out.println("微信支付: " + amount);}
}// 3. 支付工厂
class PaymentFactory {public static Payment createPayment(String type) {if ("alipay".equalsIgnoreCase(type)) {return new Alipay();} else if ("wechat".equalsIgnoreCase(type)) {return new WechatPay();}throw new IllegalArgumentException("不支持的支付类型");}
}// 4. 使用
public class Main {public static void main(String[] args) {Payment payment = PaymentFactory.createPayment("alipay");payment.pay(100.0); // 输出:支付宝支付: 100.0}
}

跨平台 UI 组件
场景:
开发跨操作系统的 UI 工具包,根据当前系统生成对应的按钮、文本框。
工厂模式应用:
抽象工厂模式生产一组匹配当前平台的 UI 组件(如 WindowsButton、MacButton)。
参考代码:

// 1. 抽象产品:按钮
interface Button {void render();
}// 2. 具体产品
class WindowsButton implements Button {@Overridepublic void render() {System.out.println("Windows 风格按钮");}
}class MacButton implements Button {@Overridepublic void render() {System.out.println("Mac 风格按钮");}
}// 3. 抽象工厂
interface UIFactory {Button createButton();
}// 4. 具体工厂
class WindowsUIFactory implements UIFactory {@Overridepublic Button createButton() {return new WindowsButton();}
}class MacUIFactory implements UIFactory {@Overridepublic Button createButton() {return new MacButton();}
}// 5. 根据系统选择工厂
public class Main {public static void main(String[] args) {// 模拟系统检测(实际可能是根据配置或环境变量)String os = "windows";UIFactory factory;if ("windows".equalsIgnoreCase(os)) {factory = new WindowsUIFactory();} else {factory = new MacUIFactory();}Button button = factory.createButton();button.render(); // 输出:Windows 风格按钮}
}

数据库连接池
场景:
根据配置切换不同的数据库(MySQL、Oracle),避免硬编码数据库驱动类。
工厂模式应用:
用工厂类封装 DriverManager.getConnection() 的创建逻辑。
参考代码:

// 1. 数据库连接接口
interface Connection {void connect();
}// 2. 具体数据库连接
class MySQLConnection implements Connection {@Overridepublic void connect() {System.out.println("MySQL 连接成功");}
}class OracleConnection implements Connection {@Overridepublic void connect() {System.out.println("Oracle 连接成功");}
}// 3. 抽象工厂
interface ConnectionFactory {Connection createConnection();
}// 4. 具体工厂
class MySQLConnectionFactory implements ConnectionFactory {@Overridepublic Connection createConnection() {return new MySQLConnection();}
}class OracleConnectionFactory implements ConnectionFactory {@Overridepublic Connection createConnection() {return new OracleConnection();}
}// 5. 使用
public class Main {public static void main(String[] args) {// 根据配置选择工厂ConnectionFactory factory = new MySQLConnectionFactory();Connection conn = factory.createConnection();conn.connect(); // 输出:MySQL 连接成功}
}

选择建议
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词