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

创建型:工厂方法模式

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景


1、核心思想

目的:将对象创建的职责委托给工厂子类,实现对象实例化与适用的解耦。

优点:

  • 解耦:将对象的创建与使用分离,降低代码耦合度。

  • 扩展性:新增产品类型时,只需添加新的工厂子类,无需修改已有代码(符合开闭原则)。

  • 多态性:客户端通过抽象接口操作对象,无需关心具体实现。

适用性:适合框架设计、跨平台组件、可插拔系统等需要灵活创建对象的场景

2、实现方式

2.1 模式结构

  • 产品(Product):定义产品的抽象类或接口,同类产品的顶级父类。

  • 子产品(ConcreteProduct):由产品类Product派生出的产品子类,实现抽象产品的具体类。

  • 工厂接口(Factory):定义工厂方法的工厂接口,当然也可以是抽象类,它使顶级工厂制造方法抽象化、标准统一化。声明工厂方法(返回抽象产品类型)。

  • 工厂实现(ConcreteFactory):实现了工厂接口的工厂实现类,返回具体产品实例。由工厂实现决定实例化哪个产品类。

2.2 实现案例

//1、产品
public interface Product {void operate();
}//2、子产品
// 具体产品A
public class ConcreteProductA implements Product {@Overridepublic void operate() {System.out.println("ProductA operation");}
}// 具体产品B
public class ConcreteProductB implements Product {@Overridepublic void operate() {System.out.println("ProductB operation");}
}//3、工厂接口
public abstract class Factory {// 工厂方法(可能包含默认实现)public abstract Product createProduct();// 其他业务逻辑(可能与产品相关)public void doSomething() {Product product = createProduct();product.operate();}
}//4、工厂实现
// 生产ProductA的工厂
public class ConcreteFactoryA extends Factory{@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 生产ProductB的工厂
public class ConcreteFactoryB extends Factory{@Overridepublic Product createProduct() {return new ConcreteProductB();}
}//5、客户端使用
public class Client {public static void main(String[] args) {Factory factory = new ConcreteFactoryA();Product product = factory.createProduct();product.operate(); // 输出:ProductA operationfactory = new ConcreteFactoryB();factory.doSomething(); // 输出:ProductB operation}
}

3、优缺点分析

优点缺点
符合开闭原则(扩展无需修改已有代码)类数量增加(每个产品需对应工厂类)
客户端与具体类解耦增加系统复杂度
支持多态性和动态绑定需要预先设计抽象层级

4、适用场景

  • 框架设计:允许用户扩展框架内部组件(如Spring的BeanFactory)。

  • 跨平台开发:不同平台创建相同接口的对象(如UI组件)。

  • 数据库访问:支持多种数据库驱动(MySQL/Oracle连接器)。

  • 日志系统:输出到文件、网络或控制台的不同日志处理器。

相关文章:

  • TASK03【Datawhale 组队学习】搭建向量知识库
  • 10.9 LangChain LCEL革命:43%性能提升+声明式语法,AI开发效率飙升实战指南
  • STM32H562----------启动时钟分析
  • Listener method could not be invoked with the incoming message
  • Linux之基础IO
  • 非线性1无修
  • python + pip 独家秘籍
  • C++ map容器: 插入操作
  • 5.18 day24
  • 新电脑软件配置三 pycharm
  • 【应用开发十】pwm
  • ffmpeg -vf subtitles添加字幕绝对路径问题的解决方法
  • [创业之路-358]:从历史轮回到制度跃迁:中国共产党创业模式的超越性密码
  • 三:操作系统线程管理之用户级线程与内核级线程
  • Milvus(25):搜索迭代器、使用分区密钥
  • 为实时数据构建WebSocket解决方案的挑战
  • Git在与远程仓库建立连接时,不小心输错密码导致连接失败,之后无法弹出用户名密码的输入框解决方案
  • 面试题总结二
  • 记录一次修改nacos安全问题导致服务调用出现404
  • KnowCard:我的知识卡片生成器是怎么炼成的?
  • 国家统计局:4月全国规模以上工业增加值同比增长6.1%
  • 北方今年首场高温过程开启,西北华北黄淮多地最高或达40℃
  • 以色列称“将立即允许恢复”人道主义物资进入加沙
  • 俄需要达成怎样的特别军事行动结果?普京:包含四个方面
  • 广西桂林、百色、河池等地表态:全力配合中央对蓝天立的审查调查
  • 多图|多款先进预警机亮相雷达展,专家:中国预警机已达世界先进水平