掌握计划模式之工厂方法模式

打印 上一主题 下一主题

主题 815|帖子 815|积分 2445

工厂方法模式

工厂方法模式(Factory Method Pattern)是一种创建型计划模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的详细类。工厂方法模式将对象的创建委托给子类,从而实现了类的实例化耽误高内聚低耦合的目标。
工厂方法模式的结构

工厂方法模式通常包含以下几个脚色:

  • Product(产物接口或抽象类)


  • 定义产物的公共接口,所有详细产物都应实现这个接口。

  • ConcreteProduct(详细产物)


  • 实现产物接口,提供详细的实现。

  • Creator(抽象工厂类)


  • 声明工厂方法,用于返回一个Product对象。这个类通常是一个抽象类或接口,定义了产物的创建过程。

  • ConcreteCreator(详细工厂类)


  • 实现工厂方法,负责实例化详细的产物对象。不同的详细工厂会创建不同的详细产物。
工厂方法模式的优缺点

优点


  • 解耦:客户端不必要关心详细产物的创建过程,只需调用工厂方法获取产物,低落了系统的耦合度。
  • 同一管理对象创建: 工厂模式可以同一管理对象的创建过程,包括初始化、配置等操作,使得创建过程更加灵活和可控。
  • 符合开闭原则:新增产物时,只必要创建新的详细产物类和工厂类,不必要修改现有代码。
  • 灵活性:通过继承和多态,子类可以决定创建哪种详细产物。
缺点


  • 类的数目增加:为了支持不同类型的产物,必须创建多个详细工厂类,类的数目会增加。
  • 可能增加系统复杂性:比简单工厂模式要复杂,可能会使得系统变得更加难以理解和维护。
工厂方法模式的示例代码

假设我们有一个汽车生产工厂,工厂可以生产不同类型的汽车,例如BMW和Audi。
类图


示例代码

产物接口和产物类
  1. public interface Car {
  2.     void drive();
  3. }
  4. public class BMW implements Car {
  5.     @Override
  6.     public void drive() {
  7.         System.out.println("Driving a BMW car.");
  8.     }
  9. }
  10. public class Audi implements Car {
  11.     @Override
  12.     public void drive() {
  13.         System.out.println("Driving an Audi car.");
  14.     }
  15. }
复制代码
工厂相关的类
  1. public abstract class CarFactory {
  2.     // 工厂方法,返回具体产品
  3.     public abstract Car createCar();
  4. }
  5. public class BMWFactory extends CarFactory {
  6.     @Override
  7.     public Car createCar() {
  8.         return new BMW(); // 返回具体的BMW对象
  9.     }
  10. }
  11. public class AudiFactory extends CarFactory {
  12.     @Override
  13.     public Car createCar() {
  14.         return new Audi(); // 返回具体的Audi对象
  15.     }
  16. }
复制代码
测试代码
  1. public class Client {
  2.     public static void main(String[] args) {
  3.         // 使用工厂方法创建汽车
  4.         CarFactory factory = new BMWFactory(); // 通过BMW工厂创建BMW汽车
  5.         Car car = factory.createCar();
  6.         car.drive(); // 输出:Driving a BMW car.
  7.         factory = new AudiFactory(); // 通过Audi工厂创建Audi汽车
  8.         car = factory.createCar();
  9.         car.drive(); // 输出:Driving an Audi car.
  10.     }
  11. }
复制代码
测试结果
Driving a BMW car.
Driving an Audi car.
工厂方法模式的变体

除了传统的工厂方法模式,偶然在实际应用中还会使用一些变体:

  • 抽象工厂模式:如果有多个产物族(即多个系列的产物),可以通过抽象工厂模式来实现每个工厂负责创建一组相关产物。与工厂方法模式的区别在于,工厂方法模式通常只涉及一个产物类的创建,而抽象工厂模式处理多个产物类的创建。
  • 工厂方法和单例模式结合:工厂方法可以和单例模式结合使用,确保工厂实例和产物实例的唯一性。
总结

工厂方法模式是一种创建型计划模式,通过将对象的创建过程委托给子类来实现灵活的产物创建。相比于简单工厂模式,工厂方法模式更加灵活,符合开闭原则,适用于必要扩展产物种类的场景,但也可能导致类数目增加。
工厂类提供某个产物的工厂方法来生产产物,隐藏对象的创建过程,使客户端无需了解对象的详细创建逻辑,使得客户端代码与详细类的解耦,淘汰了依赖,更容易维护和扩展。

  • 对象的详细创建逻辑可以使用反射、动态代理或者结合其他创建型计划模式来完成对象的实例化;
  • 引入了“中间者”和面向抽象编程使用了多态的特性,起到了解耦的作用;
  • 使用者(客户端)面向抽象(接口、抽象类)编程,而不直接依赖于详细产物类。

什么是计划模式?
单例模式及其思想
计划模式--原型模式及其编程思想
掌握计划模式之生成器模式
掌握计划模式之简单工厂模式
超实用的SpringAOP实战之日记记录
2023年下半年软考考试重磅消息
通过软考后却领取不到实体证书?
盘算机算法计划与分析(第5版)
Java全栈学习路线、学习资源和面试题一条龙
软考证书=职称证书?
软考中级--软件计划师毫无保留的备考分享

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表