深入探析设计模式:工厂模式的三种姿态

深入探析设计模式:工厂模式的三种姿态

  • 1. 简单工厂模式
    • 1.1 概念
    • 1.2 案例
    • 1.3 优缺点
  • 2. 抽象工厂模式
    • 2.1 概念
    • 2.2 案例:跨品牌手机生产
    • 2.3 优缺点
  • 3. 超级工厂模式
    • 3.1 概念
    • 3.2 案例:动物园游览
    • 3.3 优缺点
  • 4. 总结

欢迎阅读本文,今天我们将会深入学习工厂模式,这是一种重要的设计模式,用于创建对象的实例化过程。我们将分析三种工厂模式的用法:简单工厂模式、抽象工厂模式和超级工厂模式,并通过实际案例帮助您了解如何在实际开发中应用这些模式。

在这里插入图片描述

1. 简单工厂模式

1.1 概念

简单工厂模式(Simple Factory Pattern)是最基础的工厂模式,它通过一个工厂类根据不同的参数来创建不同类的实例。让我们通过一个例子来理解简单工厂模式。

1.2 案例

假设我们有不同类型的汽车:轿车、越野车和卡车。我们可以创建一个汽车工厂,根据用户的选择来制造不同类型的汽车。

class CarFactory {public Car createCar(String type) {if ("sedan".equals(type)) {return new SedanCar();} else if ("suv".equals(type)) {return new SuvCar();} else if ("truck".equals(type)) {return new TruckCar();} else {throw new IllegalArgumentException("Unknown car type");}}
}interface Car {void drive();
}class SedanCar implements Car {public void drive() {System.out.println("Driving a sedan car");}
}class SuvCar implements Car {public void drive() {System.out.println("Driving an SUV car");}
}class TruckCar implements Car {public void drive() {System.out.println("Driving a truck car");}
}public class Main {public static void main(String[] args) {CarFactory carFactory = new CarFactory();Car sedan = carFactory.createCar("sedan");Car suv = carFactory.createCar("suv");Car truck = carFactory.createCar("truck");sedan.drive();suv.drive();truck.drive();}
}

这个案例中,CarFactory根据用户的选择来创建不同类型的汽车实例。这是最简单的工厂模式,但它的缺点是新增汽车类型时,需要修改工厂类。

1.3 优缺点

  • 优点
    1. 简单易用:简单工厂模式的实现相对简单,适用于创建单一类型的对象。
    2. 封装创建逻辑:工厂类封装了对象的创建逻辑,客户端只需提供参数即可获得所需对象。
    3. 解耦:客户端与具体产品类之间解耦,降低客户端与具体类的依赖性。
  • 缺点
    1. 不易扩展:当需要新增产品时,需要修改工厂类的代码,违反了开闭原则。
    2. 代码维护难:随着产品种类增加,共产类的代码会变得臃肿,难以维护。
    3. 违背单一职责原则:工厂类负责了对象的创建和逻辑判断,导致职责不清晰。

2. 抽象工厂模式

2.1 概念

抽象工厂模式(Abstract Factory Pattern)是对简单工厂模式的进一步抽象,它提供了一个抽象的工厂接口,每个具体的工厂类实现这个接口以创建一系列相关或依赖对象的实例。让我们通过一个例子理解抽象工厂模式。

2.2 案例:跨品牌手机生产

假设我们要生产手机,分为不同品牌和型号。我们可以创建一个抽象的工厂接口,不同的品牌工厂实现这个接口来生产不同型号的手机。

interface PhoneFactory {SmartPhone createSmartPhone();FeaturePhone createFeaturePhone();
}class AppleFactory implements PhoneFactory {public SmartPhone createSmartPhone() {return new IPhone();}public FeaturePhone createFeaturePhone() {return new IPod();}
}class SamsungFactory implements PhoneFactory {public SmartPhone createSmartPhone() {return new Galaxy();}public FeaturePhone createFeaturePhone() {return new OldPhone();}
}interface SmartPhone {void makeCall();void sendText();
}interface FeaturePhone {void makeCall();
}class IPhone implements SmartPhone {public void makeCall() {System.out.println("Calling from iPhone");}public void sendText() {System.out.println("Sending text from iPhone");}
}class Galaxy implements SmartPhone {public void makeCall() {System.out.println("Calling from Galaxy");}public void sendText() {System.out.println("Sending text from Galaxy");}
}class IPod implements FeaturePhone {public void makeCall() {System.out.println("Calling from iPod");}
}class OldPhone implements FeaturePhone {public void makeCall() {System.out.println("Calling from old phone");}
}public class Main {public static void main(String[] args) {PhoneFactory appleFactory = new AppleFactory();SmartPhone iphone = appleFactory.createSmartPhone();FeaturePhone ipod = appleFactory.createFeaturePhone();PhoneFactory samsungFactory = new SamsungFactory();SmartPhone galaxy = samsungFactory.createSmartPhone();FeaturePhone oldPhone = samsungFactory.createFeaturePhone();iphone.makeCall();ipod.makeCall();galaxy.makeCall();oldPhone.makeCall();}
}

在这个案例中,PhoneFactory是抽象工厂接口,不同的品牌工厂类如AppleFactorySamsungFactory实现了这个接口。每个工厂类都可以创建不同品牌手机的实例。

2.3 优缺点

  • 优点
    1. 封装产品族创建逻辑:抽象工厂模式将一系列相关的产品组成一个产品族,工厂类负责创建整个产品族的对象。
    2. 满足开闭原则:新增产品时只需要扩展抽象工厂及其具体子类,不需要修改已有代码。
    3. 解耦产品类和客户端:客户端通过工厂接口而不是具体类来创建对象,降低了依赖。
  • 缺点
    1. 不易扩展新产品等级:当需要新增产品等级时,需要修改所有具体工厂类的代码。
    2. 复杂性增加:随着产品族和产品等级的增加,工厂和产品类的数量会增加,导致负责性提高。

3. 超级工厂模式

3.1 概念

超级工厂模式是将多个工厂模式结合在一起,形成一个层次结构的工厂模式。它可以根据不同的条件选择合适的子工厂来创建对象。让我们通过一个例子了解超级工厂模式。

3.2 案例:动物园游览

假设我们要构建一个动物园游览系统,需要创建各种动物的实例。我们可以使用超级工厂模式来管理不同种类的工厂,每个工厂负责创建一类动物。

// 动物接口
interface Animal {void makeSound();
}// 具体动物
class Lion implements Animal {public void makeSound() {System.out.println("Lion is roaring");}
}class Elephant implements Animal {public void makeSound() {System.out.println("Elephant is trumpeting");}
}class Dolphin implements Animal {public void makeSound() {System.out.println("Dolphin is squeaking");}
}// 动物工厂接口
interface AnimalFactory {Animal createAnimal();
}// 具体动物工厂
class LionFactory implements AnimalFactory {public Animal createAnimal() {return new Lion();}
}class ElephantFactory implements AnimalFactory {public Animal createAnimal() {return new Elephant();}
}class DolphinFactory implements AnimalFactory {public Animal createAnimal() {return new Dolphin();}
}public class Main {public static void main(String[] args) {AnimalFactory lionFactory = new LionFactory();AnimalFactory elephantFactory = new ElephantFactory();AnimalFactory dolphinFactory = new DolphinFactory();Animal lion = lionFactory.createAnimal();Animal elephant = elephantFactory.createAnimal();Animal dolphin = dolphinFactory.createAnimal();lion.makeSound();elephant.makeSound();dolphin.makeSound();}
}

在这个案例中,AnimalFactory是超级工厂接口,每个具体的动物工厂类如LionFactoryElephantFactoryDolphinFactory都实现了这个接口。通过不同的工厂,我们可以创建不同种类的动物。

3.3 优缺点

  • 优点
    1. 更高层次的封装:超级工厂模式将多个工厂模式结合在一起,提供更高层次的封装和抽象。
    2. 根据条件选择:根据不同条件选择合适的子工厂来创建对象,增加了灵活性和可扩展性。
    3. 满足开闭原则:当新增工厂或产品时,不需要修改已有代码,符合开闭原则。
  • 缺点
    1. 复杂性增加:超级工厂模式会引入更多的工厂类,可能会增加系统的复杂性。
    2. 不同工厂间的耦合:超级工厂模式可能会导致不同工厂之间的耦合,影响系统的维护和扩展。

4. 总结

工厂模式是面向对象设计中的重要模式之一,它能够将对象的创建和使用分离,提高代码的灵活性和可维护性。通过简单工厂模式、抽象工厂模式和超级工厂模式,我们可以根据不同的需求来选择合适的模式来创建对象。在实际开发中,根据具体情况选择合适的工厂模式可以使代码更加模块化、可扩展和易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/96126.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode | linux | c++ intelliense 被弃用解决方案

每日一句,vscode用的爽是爽,主要是可配置太强了。如果也很会研究,可以直接去咸鱼接单了 废话少说,直接整。 用着用着说是c intelliense被弃用,很多辅助功能无法使用,像查看定义、查看引用、函数跳转、智能提…

springboot集成ES

1.引入pom依赖2.application 配置3.JavaBean配置以及ES相关注解 3.1 Student实体类3.2 Teacher实体类3.3 Headmaster 实体类4. 启动类配置5.elasticsearchRestTemplate 新增 5.1 createIndex && putMapping 创建索引及映射 5.1.1 Controller层5.1.2 service层5.1.3 ser…

sass笔记

声明变量 通过$标识符进行命名及引用混合器 类似vue中的函数 通过 mixin标识定义 include 标识调用& 父选择器标识extend 进行继承可嵌套可导入 通过 import 文件位置’ 、进行导入 <style> //1 声明变量 $name: 15px; $color: skyblue;mixin border-radius($num) {/…

进入嵌入式之后究竟会干些什么?

嵌入式被称为互联网、计算机行业的万金油&#xff0c;未来的就业方向多种多样&#xff0c;工作内容也不一而足&#xff0c;但可以分为如下几个角度&#xff1a; 架构师 在大型企业中&#xff0c;一个人很难承担过多的任务&#xff0c;因为这会带来很大的风险。大企业更需要在…

“RFID与光伏板的完美融合:探索能源科技的新时代!“

随着科技的不断发展&#xff0c;人类创造出了许多令人惊叹的发明。其中&#xff0c;RFID&#xff08;Radio Frequency Identification&#xff09;技术的应用在各个领域日益广泛。最近的研究表明&#xff0c;将RFID技术应用于光伏板领域&#xff0c;不仅可以提高光伏板的效率&a…

Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

目录 引出类什么时候被加载JVM中创建对象几种方式1.new 看到new : new Book()2.反射 Class.forName(“包名.类名”)如何获取Class对象【反射的基础】案例&#xff1a;连接数据库方法 3.克隆&#xff08;拷贝&#xff09;clone浅拷贝深拷贝案例 序列化和反序列化对象流-把对象存…

intelij idea 2023 创建java web项目

1.点击New Project 2.创建项目名称为helloweb &#xff0c;jdk版本这里使用8&#xff0c;更高版本也不影响工程创建 点击create 3.新建的工程是空的&#xff0c;点击File-> Project Structure 4.点击Modules 5.点击加号&#xff0c;然后键盘输入web可以搜索到web模块&…

完全备份、增量备份、差异备份、binlog日志

Top NSD DBA DAY06 案例1&#xff1a;完全备份与恢复案例2&#xff1a;增量备份与恢复案例3&#xff1a;差异备份与恢复案例4&#xff1a;binlog日志 1 案例1&#xff1a;完全备份与恢复 1.1 问题 练习物理备份与恢复练习mysqldump备份与恢复 1.2 方案 在数据库服务器192…

考研408 | 【计算机网络】 传输层

导图 传输层的功能 传输层的两个协议 传输层的寻址与端口 UDP协议 UDP的主要特点 UDP首部格式&#xff1a; UDP校验&#xff1a; TCP协议 TCP协议的特点 TCP报文段首部格式 TCP连接管理 TCP的连接建立 SYN洪泛攻击 TCP的连接释放 TCP可靠传输 序号&#xff1a; 确认&#xff1…

三本书与三场发布会,和鲸社区重新定义编程类书籍从阅读到实践新体验

当 AI 开发者社区配备 AI 基础设施开发平台工具时&#xff0c;它还能做什么&#xff1f; 答案是&#xff1a;过去半年&#xff0c;和鲸社区凭借在气象、医学、社科等垂直领域的长期积累以及多方伙伴的支持&#xff0c;联合举办了三场新书发布会——从 Python 到 R 语言 、从气…

虚拟机远程连接出现 Connection refused: connect问题(已解决)

如果你也跟我一样出现了这样的问题&#xff0c;并且网上的方法试了都不行&#xff0c;不妨试试我的简单粗暴的方法&#xff0c; 那就是拔网线&#xff0c;我的就是拔网线&#xff0c;重新连接就行了&#xff0c;佛了

【从0开始学架构笔记】01 基础架构

文章目录 一、架构的定义1. 系统与子系统2. 模块与组件3. 框架与架构4. 重新定义架构 二、架构设计的目的三、复杂度来源&#xff1a;高性能1. 单机复杂度2. 集群复杂度2.1 任务分配2.2 任务分解&#xff08;微服务&#xff09; 四、复杂度来源&#xff1a;高可用1. 计算高可用…

【网络教程】如何创建/添加钉钉机器人以及如何获取机器人的Token/Secret

文章目录 创建钉钉机器人添加钉钉机器人获取机器人的Token/Secret相关网站创建钉钉机器人 这里以PC端的操作为例,按照如下操作进行 访问 钉钉开放平台选择机器人选项卡,点击右上角的创建应用,这里会有一个弹窗,我这里选择的是继续使用旧版,如图按照要求填写相关信息创建自…

Linux实用运维脚本分享

Linux实用运维脚本分享&#x1f343; MySQL备份 目录备份 PING查询 磁盘IO检查 性能相关 进程相关 javadump.sh 常用工具安装 常用lib库安装 系统检查脚本 sed进阶 MySQL备份 #!/bin/bashset -eUSER"backup" PASSWORD"backup" # 数据库数据目录…

2024浙大MBA/MEM/MPA四个月冲刺备考策略

近期收到很多考生的咨询&#xff1a;距离联考就仅剩四个多月的时间&#xff0c;这个管理类联考的难度如何&#xff1f;主要考些什么内容&#xff1f;现在才开始备考还有希望上岸浙大吗&#xff1f;是不是要等到明年在开始备考比较合适&#xff1f;那么今天在这里小立老师就跟大…

分布式锁有哪些应用场景和实现?

电商网站都会遇到秒杀、特价之类的活动&#xff0c;大促活动有一个共同特点就是访问量激增&#xff0c;在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化&#xff0c;但整体的并发还是平时的数倍以上&#xff0c;参加活动的商…

【100天精通python】Day39:GUI界面编程_PyQt 从入门到实战(下)_图形绘制和动画效果,数据可视化,刷新交互

目录 专栏导读 6 图形绘制与动画效果 6.1 绘制基本图形、文本和图片 6.2 实现动画效果和过渡效果 7 数据可视化 7.1 使用 Matplotlib绘制图表 7.2 使用PyQtGraph绘制图表 7.3 数据的实时刷新和交互操作 7.3.1 数据的实时刷新 7.3.2 交互操作 7.4 自定义数据可视化…

易服客工作室:Pixwell主题 – 现代杂志/WordPress新闻主题

PixWell主题概述 Pixwell主题是一个强大、多用途和现代的WordPress杂志主题&#xff0c;具有像素完美的设计、出色的功能、完全响应和移动友好。它非常灵活&#xff0c;非常适合食谱、时尚、旅行、技术、个人或任何其他很棒的杂志和博客网站。 该主题与 Elementor、Cooked&am…

【Maven教程】(一)入门介绍篇:Maven基础概念与其他构建工具:理解构建过程与Maven的多重作用,以及与敏捷开发的关系 ~

Maven入门介绍篇 1️⃣ 基础概念1.1 构建1.2 maven对构建的支持1.3 Maven的其他作用 2️⃣ 其他构建工具2.1 IDE2.2 Make2.3 Ant2.4 Jenkins 3️⃣ Maven与敏捷开发&#x1f33e; 总结 1️⃣ 基础概念 "Maven"可以翻译为 “知识的积累者” 或 “专家”。这个词源于波…

【解决】Kafka Exception thrown when sending a message with key=‘null‘ 异常

问题原因&#xff1a; 如下图&#xff0c;kafka 中配置的是监听域名的方式&#xff0c;但程序里使用的是 ip:port 的连接方式。 解决办法&#xff1a; kafka 中配置的是域名的方式&#xff0c;程序里也相应配置成 域名:port 的方式&#xff08;注意&#xff1a;本地h…