当前位置: 首页 > news >正文

设计模式之【工厂模式、适配器模式】

工厂模式(Factory Pattern)

定义:
工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法使一个类的实例化延迟到其子类。

主要类型:

  1. 简单工厂模式(Simple Factory Pattern): 又叫静态工厂方法,由一个工厂类根据传入的参数,决定创建哪一种产品类的实例。
  2. 工厂方法模式(Factory Method Pattern): 定义一个创建对象的接口,但让子类决定实例化哪个类。
  3. 抽象工厂模式(Abstract Factory Pattern): 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

优点:

  • 代码复用性高。
  • 隐藏了对象的创建细节。
  • 降低了代码的耦合性。

适用场景:

  • 需要创建的对象具有复杂的创建过程。
  • 客户端不需要知道实际创建的具体类。
  • 系统结构需要灵活地添加新产品。

示例代码:

// 简单工厂模式示例
public class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ProductA();} else if (type.equals("B")) {return new ProductB();}return null;}
}public interface Product {void use();
}public class ProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");}
}public class ProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");}
}

适配器模式(Adapter Pattern)

定义:
适配器模式是一种结构型设计模式,它将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

优点:

  • 让两个不兼容的类能够合作。
  • 提高了类的复用性。
  • 灵活性高。

适用场景:

  • 系统需要使用现有的类,而这些类的接口不符合系统的需求。
  • 需要创建一个可以复用的类,能够与其他不相关或不可预见的类(即这些类可能具有不兼容的接口)协同工作。

示例代码:

// 目标接口
public interface Target {void request();
}// 需要适配的类
public class Adaptee {public void specificRequest() {System.out.println("Specific request");}
}// 适配器类
public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 客户端代码
public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}

何时使用工厂模式和适配器模式

工厂模式:

  • 当对象的创建逻辑复杂且需要集中管理时。
  • 当系统需要在不修改客户端代码的情况下引入新产品时。
  • 当客户端不关心具体产品类的创建过程时。

适配器模式:

  • 当现有类的接口与客户端要求的接口不兼容时。
  • 当需要使用现有的类,但它的接口不符合需求时。
  • 当希望创建一个可以与其他不相关类或未来不可预见的类一起工作的可复用类时。

通过这些解释和代码示例,希望能帮助你更好地理解工厂模式和适配器模式及其使用场景。

http://www.lryc.cn/news/386048.html

相关文章:

  • 云计算:重塑数字时代的基石
  • C# SocketUDP服务器,组播
  • 上市公司绿色投资者原始数据+计算代码(2008-2022年)
  • Redis-主从复制-测试主从模式下的读写操作
  • Linux系统应用与设置(3):串口调试(minicom)
  • Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)
  • Chrome Extension如何让work flow在页面刷新、跳转继续执行任务
  • 数据库调优厂商 OtterTune 宣布停止运营
  • 4、面向对象-typescript
  • 大数据学习之分布式数据采集系统Flume学习
  • 谁用谁夸,为什么BI零售数据分析方案这么受欢迎?
  • 多路h265监控录放开发-(14)通过PaintCell自定义日历控件继承QCalendarWidget的XCalendar类
  • 安卓速度下载v1.0.5/聚合短视频解析下载
  • 从赛题切入谈如何学习数学建模
  • 江山欧派杯2024全国华佗五禽戏线上线下观摩交流比赛在亳州开幕
  • 怪兽充电一季度由盈转亏:营收大幅下滑,消费者投诉不断
  • 激光与相机融合标定汇总:提升融合算法的精度与可靠性(附github地址)
  • 市场拓展招聘:完整指南
  • Leetcode 501:二叉搜索树中的众数
  • esp8266 GPIO
  • ingress相关yaml文件报错且相关资源一切正常解决方法
  • 重要通知:据最新TEMU要求所有欧区车灯都需要能效标签(eu energy lable)
  • JAVA SDK 整合 AI 大语言模型
  • 【Apache Doris】如何实现高并发点查?(原理+实践全析)
  • 解决SpringMVC使用MyBatis-Plus自定义MyBaits拦截器不生效的问题
  • Swagger与RESTful API
  • MySQL84 -- ERROR 1524 (HY000): Plugin ‘msql_native_password‘ is not loaded.
  • 将Excel中的错误值#N/A替换成心仪的字符串,瞬间爱了……
  • AI大模型日报#0628:谷歌开源9B 27B版Gemma2、AI首次实时生成视频、讯飞星火4.0发布
  • 【随笔】提高代码学习水平(以更高的视角看事物)