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

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

  • 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.mzph.cn/news/36245.shtml

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

相关文章

go入门实践四-go实现一个简单的tcp-socks5代理服务

文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后&#…

英语词法——代词

代词是用来代替名词、起名词作用的短语、分句和句子的词。英语中代词根据其意义和作用可分为九类:人称代词、物主代词、反身代词、相互代词、指示代词、疑问代词、不定代词、关系代词和连接代词。 第一节 人称代词 一、人称代词的形式和用法 人称代词单数复数第一人称第二人…

【ARM 嵌入式 编译系列 4 -- GCC 编译属性 __read_mostly 详细介绍】

文章目录 __read_mostly 介绍__read_mostly 在 linux 中的使用.data.read_mostly 介绍 __read_mostly 介绍 __read_mostly 是一个在Linux内核编程中用到的宏定义,这是一个gcc编译器的属性,用于告诉编译器此变量主要用于读取,很少进行写入&am…

MYSQL中用字符串2022-07去匹配Date类型大于2022-07-01并小于2022-07-31

正文 需求上,是有个日期字符串,例如2022-07,代表着年月。数据库中表对于这个字段存的是年月日,例如:2022-07-15。 我希望的是:获取到2022-07-01到2022-07-31,之间的数据,条件是&…

21款美规奔驰GLS450更换中规高配主机,汉化操作更简单

很多平行进口的奔驰GLS都有这么一个问题,原车的地图在国内定位不了,语音交互功能也识别不了中文,原厂记录仪也减少了,使用起来也是很不方便的。 可以实现以下功能: ①中国地图 ②语音小助手(你好&#xf…

【BASH】回顾与知识点梳理(二十六)

【BASH】回顾与知识点梳理 二十六 二十六. 二十一至二十五章知识点总结及练习26.1 总结26.2 模拟26.3 简答题 该系列目录 --> 【BASH】回顾与知识点梳理(目录) 二十六. 二十一至二十五章知识点总结及练习 26.1 总结 Linux 操作系统上面&#xff0c…

unittest单元测试

当你在编写测试用例时,可以使用Python内置的unittest模块来进行单元测试。下面是一个逐步指南,帮助你理解如何编写和运行基本的单元测试。 导入必要的模块: 首先,你需要导入unittest模块和需要测试的模块(例如&#xf…

运维监控学习笔记8

在服务器端,我们添加了nginx-server的主机: 在解决Error问题的过程中,我还通过zabbix_get这个命令进行了测试,发现是没有的,后来确认是在web页面配置的过程中,我输错了密码。 yum install zabbix-getzabbi…

uniapp-原生地图截屏返回base64-进行画板编辑功能

一、场景 vue写uniapp打包安卓包,实现原生地图截屏(andirod同事做的)-画板编辑功能 实现效果: 二、逻辑步骤简略 1. 由 原生地图nvue部分,回调返回 地图截屏生成的base64 数据, 2. 通过 uni插件市场 im…

《图解HTTP》——HTTP协议详解

一、HTTP协议概述 HTTP是一个属于应用层的面向对象协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP…

muduo 29 异步日志

目录 Muduo双缓冲异步日志模型: 异步日志实现: 为什么要实现非阻塞的日志

SQL 语句解析过程详解

SQL 语句解析过程详解: 1.输入SQL语句 2.词法分析------flex 使用词法分析器(由Flex生成)将 SQL 语句分解为一个个单词,这些单词被称为“标记“。标记包括关键字、标识符、运算符、分隔符等。 2.1 flex 原…

【CSS 布局】水平垂直方向居中

【CSS 布局】水平垂直方向居中 单行元素 <div class"container"><div class"item"></div> </div>方式一&#xff1a;relative 和 absolute .container {position: relative;height: 400px;border: 1px solid #ccc;.item {posit…

20个互联网用户Python数据分析项目

这篇文章给大家整理了20个互联网用户数据分析的项目。所有收录的项目&#xff0c;进行了严格的筛选&#xff0c;标准有二&#xff1a; 1.有解说性文字&#xff0c;大家能知道每一步在干嘛&#xff0c;新手友好 2.数据集公开&#xff0c;保证大家可以在原文的基础上自行探索 更…

[保研/考研机试] KY96 Fibonacci 上海交通大学复试上机题 C++实现

题目链接&#xff1a; KY96 Fibonacci https://www.nowcoder.com/share/jump/437195121692000803047 描述 The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} are defined by the recurrence: F00 F11 FnFn-1Fn-2,n>2 Write a program to calculate the Fibon…

【STM32】FreeRTOS互斥量学习

互斥量&#xff08;Mutex&#xff09; 互斥量又称互斥信号量&#xff08;本质也是一种信号量&#xff0c;不具备传递数据功能&#xff09;&#xff0c;是一种特殊的二值信号量&#xff0c;它和信号量不同的是&#xff0c;它支持互斥量所有权、递归访问以及防止优先级翻转的特性…

人文景区有必要做VR云游吗?如何满足游客出行需求?

VR云游在旅游行业中的应用正在快速增长&#xff0c;为游客带来沉浸式体验的同时&#xff0c;也为文旅景区提供了新的营销方式。很多人说VR全景展示是虚假的&#xff0c;比不上真实的景区触感&#xff0c;人文景区真的有必要做VR云游吗&#xff1f;我的答案是很有必要。 如果你认…

【跟小嘉学 Rust 编程】十二、构建一个命令行程序

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据)

【Pytroch】基于K邻近算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种简单但常用的机器…

Redis基础学习

目录 第一章、Redis数据库的下载和安装1.1&#xff09;nosql数据库和 Redis 介绍1.2&#xff09;Windows中下载安装Redis数据库1.3&#xff09;Linux中安装Redis数据库1.4&#xff09;Linux中启动redis1.5&#xff09;Linux中关闭redis 第二章、三种Redis客户端连接Redis数据库…