首页 > 其他分享 >比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)

比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)

时间:2025-01-22 10:30:59浏览次数:3  
标签:Pattern Factory 模式 工厂 方法 public

工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。这种模式让类的实例化推迟到子类,从而实现了创建逻辑与具体实现的分离。通过这种方式,工厂方法模式使得一个框架可以不依赖于具体的类,而只依赖于抽象类或接口,提高了代码的灵活性和可扩展性。

太抽象了
我们先说一下简单工厂,简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。
相当于我们有一个工厂类,有一个工厂方法,我们给这个工厂方法传入不同的参数,这个工厂就给我生成不同的对象。但是简单工厂有一个问题就是,如果我们要新增产品,我们就需要修改工厂方法。这样就违反了开闭原则。

工厂方法模式(Factory Method Pattern)概述

工厂方法模式(Factory Method Pattern)结构图

在这里插入图片描述

工厂方法模式(Factory Method Pattern)涉及的角色

  1. 产品接口(Product):声明了所有具体产品必须实现的操作。所有的具体产品类都实现了这个接口或继承自这个抽象类。
public interface Product {
    void operation();
}
  1. 具体产品(ConcreteProduct):实现了Product接口,提供了具体产品的实现。
public class ConcreteProductA implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

public class ConcreteProductB implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}
  1. 创建者/工厂接口(Creator):接口或抽象类,声明了工厂方法,该方法返回Product类型的对象。创建者还可以包含其他业务逻辑,这些逻辑可以调用工厂方法来创建产品对象。
public abstract class Creator {
    // 工厂方法
    public abstract Product factoryMethod();

    // 其他业务逻辑
    public void someOperation() {
        Product product = this.factoryMethod();
        product.operation(); // 使用创建的产品
    }
}
  1. 具体创建者(ConcreteCreator):实现了Creator中的工厂方法,每个具体创建者都会返回不同类型的Product对象。
public class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

public class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

talk is cheap, show you my code

// 定义产品接口
public interface Shape {
    void draw();
}

// 实现具体产品
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle.");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle.");
    }
}

// 定义创建者接口
public abstract class ShapeFactory {
    public abstract Shape createShape();

    public void drawShape() {
        Shape shape = createShape();
        shape.draw();
    }
}

// 实现具体创建者
public class CircleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

public class RectangleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        circleFactory.drawShape(); // Drawing a circle.

        ShapeFactory rectangleFactory = new RectangleFactory();
        rectangleFactory.drawShape(); // Drawing a rectangle.
    }
}

工作流程

  1. 客户端创建具体的工厂对象(如 CircleFactory 或 RectangleFactory)。
  2. 调用工厂对象的 drawShape() 方法。
  3. drawShape() 方法内部调用 createShape() 方法,由具体的工厂子类决定创建哪种类型的 Shape 实例。
  4. 创建的 Shape 实例的 draw() 方法被执行,输出相应的绘制信息。

总结

工厂方法模式的优点

  • 遵循开闭原则:新增加产品时,只需要添加新的具体产品类和对应的创建者类,无需修改现有代码,这符合面向对象设计中的开闭原则(Open/Closed Principle)。
  • 支持多态行为:客户端代码可以通过基类或接口来操作对象,而不需要关心具体的产品类型。
  • 解耦合:工厂方法模式将创建对象的责任推给了子类,减少了客户端代码与具体产品之间的耦合度。
  • 易于扩展:当需要引入新产品时,只需创建相应的产品类和创建者类即可,而不必修改现有代码。

工厂方法模式的具体应用场景

  • 创建复杂对象:当对象的创建过程较为复杂时,可以使用工厂方法模式将创建逻辑封装起来。
  • 不确定具体类型:当你事先不知道需要创建哪种类型的对象时,可以使用工厂方法模式,在运行时根据条件动态选择。
  • 代码重构:如果你发现代码中有大量的条件判断用来创建不同类型的对象,那么可以考虑使用工厂方法模式来重构代码,使其更加简洁和易于维护。
  • 框架开发:在开发框架时,工厂方法模式可以让框架用户通过继承来定制化对象的创建过程,而不需要修改框架本身的代码。

什么时候考虑使用工厂方法模式

  1. 当一个类不知道它所必须创建的对象的类时。
  2. 当一个类希望由它的子类来指定它所创建的对象时。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时。

工厂方法模式提供了一种有效的方式来解耦对象的创建与使用,使得系统更加灵活和易于扩展。对于那些需要根据条件动态创建不同类型对象的情况,工厂方法模式是一个非常有用的工具。理解如何正确使用工厂方法模式可以帮助开发者构建更加模块化和易于维护的软件系统。

标签:Pattern,Factory,模式,工厂,方法,public
From: https://blog.csdn.net/Zongkunxue/article/details/145291491

相关文章

  • springboot毕设 工厂车间管理系统的设计与实现 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着制造业的快速发展,工厂车间的运营效率和管理水平成为了决定企业竞争力的关键因素之一。传统的车间管理方式大多依赖于人工记录和口头传达,这种方式......
  • Golang学习笔记_28——工厂方法模式
    Golang学习笔记_25——协程Golang学习笔记_26——通道Golang学习笔记_27——单例模式文章目录工厂方法模式1.介绍2.优点3.类图4.实现源码工厂方法模式1.介绍工厂方法模式(FactoryMethod)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实......
  • 基于AutoDL 进行 Llama_Factory+LoRA大模型微调
       其实这个环境的搭建比较容易,但是其中出现在AutoDL上访问WebUI界面是无法访问的,对该问题查阅了一些资料并记录.1.环境的配置及其校验Step1.使用Conda创建LLaMA-Factory的python虚拟环境condacreate-nllama_factorypython==3.11创建完成后,通过如下命令进入该......
  • 少一点If/Else - 状态模式(State Pattern)
    状态模式(StatePattern)状态模式(StatePattern)状态模式(StatePattern)概述状态模式(StatePattern)结构图状态模式(StatePattern)涉及的角色talkischeap,showyoumycode总结状态模式(StatePattern)状态模式(StatePattern)是一种行为型设计模式,它允许对象在其内部状态......
  • 数字工厂规划蓝图报告(69页 参考学习 PPT)
            该报告为数字化工厂规划蓝图的整体进展情况概述,对该内容的简洁总结:        详细记录了项目在各个阶段的准备工作和核心任务。在项目准备阶段(编号0),主要完成了以下工作:-0.1项目工作方法制定:确立了项目执行的基本方法和流程。-0.2项目工作计划制......
  • 设计模式-工厂模式-宏注册
    组织代码的方式如果项目非常小且简单,或者明确知道将来不会需要额外的维护和功能扩展,那么面向过程可能是一个更快且成本更低的方案。项目需求和特定场景。有些项目可能更适合面向过程的开发模式,比如一些计算密集型的科学计算软件,在大型项目开发中,面向对象的方法支持更好......
  • 更灵活的对象之间的联动 - 观察者模式(Observer Pattern)
    观察者模式(ObserverPattern)观察者模式(ObserverPattern)观察者模式(ObserverPattern)概述观察者模式(ObserverPattern)结构图观察者模式(ObserverPattern)涉及的角色talkischeap,showyoumycode总结观察者模式(ObserverPattern)观察者模式(ObserverPattern)是一种......
  • 单例模式(Singleton Pattern)——游戏开发常用设计模式(一)
    前言单例模式应该是在unity游戏开发中最简单最常用的设计模式之一,无论是管理全局游戏状态、处理资源加载,还是控制音频播放,单例模式都能为我们提供一个简洁的解决方案——确保一个类只有一个实例,并允许在游戏的任何地方轻松访问它。然而,这种便利性也伴随着潜在的风险,比如代码耦合......
  • 【从零开始系列】Qwen2.5 & Llama-Factory:开源语言大模型+训练平台——(超详细、最新版
    目录一、简介        1.Qwen2.5:开源模型        2.LLaMA-Factory:微调工具二、环境搭建       1.Python和Pytorch版本        2.llamafactory项目克隆安装       3.其他重要库安装三、模型微调       1.预训练模......
  • 设计模式——工厂模式
    工厂模式实现工厂模式的方法前置条件简单工厂模式(SimpleFactory)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)应用场景总结工厂模式(FactoryPattern)是软件工程中的一种创建型设计模式。使用工厂模式可以将对象的创建与使用分离,也就是说,客户端代码不......