小谈设计模式(9)—工厂方法模式

2023-10-08 20:30

本文主要是介绍小谈设计模式(9)—工厂方法模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小谈设计模式(9)—工厂方法模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 工厂方法模式
    • 角色分类
      • 抽象产品(Abstract Product)
      • 具体产品(Concrete Product)
      • 抽象工厂(Abstract Factory)
      • 具体工厂(Concrete Factory)
    • 核心思想
    • Java代码实现:
      • 假设有一个汽车工厂,可以生产不同类型的汽车,包括小轿车和SUV。首先定义一个抽象汽车类(AbstractProduct):
      • 然后定义具体的小轿车类(ConcreteProduct1)和SUV类(ConcreteProduct2),它们都继承自抽象汽车类:
      • 接下来定义抽象汽车工厂类(AbstractFactory),其中包含一个创建汽车的抽象方法:
      • 然后定义具体的小轿车工厂类(ConcreteFactory1)和SUV工厂类(ConcreteFactory2),它们都继承自抽象汽车工厂类:
      • 最后,在客户端代码中使用工厂方法来创建汽车对象:
      • 输出结果为
      • 分析
    • 优缺点分析
      • 优点
        • 符合开闭原则
        • 封装了对象的创建过程
        • 降低了客户端和具体产品的耦合
        • 可以通过配置文件等方式动态指定具体工厂类
      • 缺点
        • 增加了系统的复杂度
        • 增加了代码的数量
        • 客户端需要知道具体工厂类

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

工厂方法模式

工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式将对象的实例化推迟到子类中进行。

角色分类

抽象产品(Abstract Product)

定义了产品的接口,是具体产品类的共同父类或接口。

具体产品(Concrete Product)

实现了抽象产品接口的具体类。

抽象工厂(Abstract Factory)

定义了创建产品的接口,包含一个或多个创建产品的抽象方法。

具体工厂(Concrete Factory)

实现了抽象工厂接口,负责实例化具体产品。
在这里插入图片描述

核心思想

将对象的创建与使用分离,客户端通过调用工厂方法来创建对象,而不是直接实例化具体产品。这样做的好处是,客户端只需要知道抽象产品和抽象工厂的存在,而无需关心具体产品的细节。当需要创建不同类型的产品时,只需要实现对应的具体产品和具体工厂即可,而不需要修改客户端的代码。

在这里插入图片描述

Java代码实现:

假设有一个汽车工厂,可以生产不同类型的汽车,包括小轿车和SUV。首先定义一个抽象汽车类(AbstractProduct):

public abstract class Car {public abstract void drive();
}

然后定义具体的小轿车类(ConcreteProduct1)和SUV类(ConcreteProduct2),它们都继承自抽象汽车类:

public class SedanCar extends Car {@Overridepublic void drive() {System.out.println("Driving sedan car...");}
}public class SUV extends Car {@Overridepublic void drive() {System.out.println("Driving SUV...");}
}

接下来定义抽象汽车工厂类(AbstractFactory),其中包含一个创建汽车的抽象方法:

public abstract class CarFactory {public abstract Car createCar();
}

然后定义具体的小轿车工厂类(ConcreteFactory1)和SUV工厂类(ConcreteFactory2),它们都继承自抽象汽车工厂类:

public class SedanCarFactory extends CarFactory {@Overridepublic Car createCar() {return new SedanCar();}
}public class SUVFactory extends CarFactory {@Overridepublic Car createCar() {return new SUV();}
}

最后,在客户端代码中使用工厂方法来创建汽车对象:

public class Client {public static void main(String[] args) {CarFactory factory1 = new SedanCarFactory();Car sedanCar = factory1.createCar();sedanCar.drive();CarFactory factory2 = new SUVFactory();Car suv = factory2.createCar();suv.drive();}
}

输出结果为

Driving sedan car...
Driving SUV...

分析

通过工厂方法模式,客户端代码只需要与抽象产品和抽象工厂进行交互,而无需关心具体产品的创建过程。当需要新增其他类型的汽车时,只需要实现对应的具体产品和具体工厂即可,而不需要修改客户端的代码,实现了代码的可扩展性和可维护性。
在这里插入图片描述

优缺点分析

优点

符合开闭原则

工厂方法模式通过引入抽象工厂和具体工厂的概念,使得系统的扩展性更好。当需要新增一种产品时,只需要新增对应的具体产品和具体工厂,而不需要修改已有的代码,符合开闭原则。

封装了对象的创建过程

客户端只需要关心抽象产品和抽象工厂,而无需关心具体产品的创建过程。具体产品的创建过程被封装在具体工厂中,使得客户端代码更加简洁、可读性更高。

降低了客户端和具体产品的耦合

客户端只依赖于抽象产品和抽象工厂,而不依赖于具体产品。这样可以使客户端代码与具体产品解耦,提高代码的灵活性和可维护性。

可以通过配置文件等方式动态指定具体工厂类

工厂方法模式可以通过配置文件、反射等方式动态指定具体工厂类,从而实现更加灵活的对象创建方式。
在这里插入图片描述

缺点

增加了系统的复杂度

引入抽象工厂和具体工厂的概念,使得系统的结构变得更加复杂。如果系统中只有少量的产品,使用工厂方法模式可能会显得过于复杂,不利于维护和理解。

增加了代码的数量

工厂方法模式需要定义抽象产品、具体产品、抽象工厂、具体工厂等多个类,这增加了代码的数量。对于简单的项目,使用工厂方法模式可能会显得冗余。

客户端需要知道具体工厂类

客户端需要知道具体工厂类的存在,这增加了客户端的依赖。如果具体工厂类的创建逻辑发生变化,客户端代码也需要相应的修改。

在这里插入图片描述

这篇关于小谈设计模式(9)—工厂方法模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/167787

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T