代理模式和工厂模式

本文详细探讨了代理模式的两种实现方式——JDK动态代理和CGLIB动态代理,强调了JDK动态代理需要接口的约束,而CGLIB则无需基于接口。同时,文章还介绍了工厂模式,阐述了如何通过定义接口和实现类来应对不同数据场景下的对象创建需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、代理模式(1、代理类和被代理对象;2、被代理对象不想去执行的方法;3、代理)
1.1、JDK动态代理(字节码重组)
代理类实现接口 invocationHandler ,实现invoke 方法,和获取getInstance()方法获取代理对象$Proxy0
h.invoke()通过接口调用被代理对象的方法
jdk动态代理,必须有接口,实现类实现接口中的为实现的 方法。

手写动态代理:
定义字节的classLoader,findClass方法读取生成的代理对象Proxy0定义自己的InvocationHandler定义invoke方法定义自己的Proxy代理对象自己写的代码生成代理类“Proxy0 定义自己的InvocationHandler 定义invoke方法 定义自己的Proxy 代理对象 自己写的代码生成代理类“Proxy0InvocationHandlerinvokeProxyProxy0”,有generate生成代码的方法,读取源代码,编译,用ClassLoader把字节码加载到jvm 中。返回代理对象(一般是通过constructor),
1.2、cglib动态代理
不用是基于接口的代理
代理类 implements MethodInterceptor,实现intercepter方法,
cglib是利用 Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());//被代理类
enhancer.setCallback(this);
return enhancer.create();
利用以上代码获取被代理类的子类,so在interceptor 方法中,要用 method.invokeSupper(o,args);执行代理方法

2、工厂模式
简单工程模式:定义接口(规则),定义的多个实现类(实现给定的规则),当不同的数据时,返回不同类型的实现

<think>好的,我现在需要解释代理模式工厂模式区别。首先,我需要回忆一下这两种模式的基本概念用途。根据用户提供的引用内容,工厂模式属于创建型模式,而代理模式可能属于结构型或行为型模式?不过根据引用[2]中的描述,代理模式被提到策略模式工厂模式对比,但具体分类可能需要确认。 首先,工厂模式的主要目的是创建对象,将对象的创建过程封装起来,提高灵活性解耦。引用[1]提到工厂模式分为简单工厂工厂方法抽象工厂,都是处理对象创建的问题。用户可能已经知道这些,但需要明确它与代理模式的不同。 接下来是代理模式。根据常见的知识,代理模式属于结构型模式,用于为其他对象提供一个代理以控制对这个对象的访问。例如,延迟加载、权限控制等。但引用[2]中没有详细说明代理模式,所以可能需要依赖我的现有知识。需要确认代理模式的用途特点,确保不与工厂混淆。 用户需要区别这两者,所以需要从用途、关注点、解决问题类型等方面展开。根据引用[2],工厂模式关注对象创建,而策略模式关注行为封装,代理模式可能关注访问控制或增强功能。例如,代理模式可能用于添加日志、缓存等功能,而不改变原有对象的接口。 需要确保解释通俗易懂,比如用现实例子说明。例如,工厂像生产汽车的工厂,负责制造汽车;代理像汽车的4S店,作为中间商处理销售、维修,而汽车本身的功能不变。这样用户更容易理解两者的不同。 同时要避免技术术语过多,保持简单。需要检查是否有混淆点,比如是否有时代理模式可能涉及对象的创建?比如虚拟代理可能会延迟创建对象,但这依然是代理控制访问的一部分,而工厂则是专门负责创建。 最后,生成相关问题,帮助用户进一步学习,比如应用场景、如何实现等。</think>### 代理模式工厂模式区别及说明 #### 1. **核心目的不同** - **工厂模式**:属于**创建型模式**,专注于**如何创建对象**。它像“生产车间”,根据需求生产特定类型的对象,隐藏对象创建细节。例如: ```python class CarFactory: def create_car(self, type): if type == "SUV": return SUV() elif type == "Sedan": return Sedan() ``` 用户只需告诉工厂“需要SUV”,工厂就会返回一辆SUV对象,无需关心具体构造过程[^1]。 - **代理模式**:属于**结构型模式**,专注于**如何控制对象的访问**。它像“中介”或“保镖”,在对象访问前后添加额外逻辑(如权限检查、缓存),但不改变对象的核心功能。例如: ```python class RealImage: def display(self): print("显示图片") class ProxyImage: def __init__(self): self.real_image = None def display(self): if self.check_access(): if not self.real_image: self.real_image = RealImage() # 延迟加载 self.real_image.display() def check_access(self): print("检查用户权限") return True ``` 代理在调用`display()`前先验证权限,再决定是否执行真实对象的操作[^2]。 --- #### 2. **解决的问题不同** - **工厂模式**: 解决**对象创建的统一管理**问题。例如,系统需要支持多种数据库(MySQL、PostgreSQL),工厂可以根据配置返回对应的数据库连接对象,避免代码中散落`new MySQL()`或`new PostgreSQL()`的硬编码[^1]。 - **代理模式**: 解决**对象访问的增强或限制**问题。例如: - 为敏感操作添加权限验证(如删除文件前的确认); - 实现延迟加载(如大型图片仅在需要时加载); - 记录日志或监控性能。 --- #### 3. **类比解释** - **工厂模式**: 像“餐馆后厨”,顾客点菜后,后厨决定用哪些食材、如何烹饪,最终将菜品交给顾客,顾客无需关心制作过程。 - **代理模式**: 像“餐厅服务员”,顾客通过服务员点菜,服务员可能推荐菜品(功能增强)或检查顾客权限(如VIP专区),再将请求传递给后厨,但菜品本身的味道(核心功能)不变。 --- #### 4. **代码中的典型区别** | 场景 | 工厂模式 | 代理模式 | |--------------------|----------------------------------|----------------------------------| | **对象创建** | 直接返回新对象 | 可能包装现有对象或延迟创建对象 | | **方法调用** | 不干预对象方法 | 在调用前后添加额外逻辑 | | **与对象的关系** | 生成对象后即结束职责 | 长期持有对象并管理其行为 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值