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

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

  • 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.hqwc.cn/news/67032.html

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

相关文章

Mac RN环境搭建

RN ios android原生环境搭建有时候是真恶心,电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限,执行失败。因为Mac…

Android系统-进程-Binder1-概述

目录 引言: 一次拷贝 Binder一次通信过程 应用启动中的binder交互 C/S模式: Binder COMMAND BWR数据结构: 引言: Android的binder是从openbinder发展过来的。包括了binder驱动,Native层,Java层。用…

TCGA数据下载推荐:R语言easyTCGA包

#使用easyTCGA获取数据 #清空 rm(listls()) gc() # 安装bioconductor上面的R包 options(BioC_mirror"https://mirrors.tuna.tsinghua.edu.cn/bioconductor") if(!require("BiocManager")) install.packages("BiocManager") if(!require("TC…

2023年京东宠物食品行业数据分析(京东大数据)

宠物食品市场需求主要来自于养宠规模,近年来由于我国宠物数量及养宠人群的规模均在不断扩大,宠物相关产业和市场规模也在蓬勃发展,宠物食品市场也同样保持正向增长。 根据鲸参谋电商数据分析平台的相关数据显示,2023年1月-7月&am…

JS逆向系列之猿人学爬虫第11题 - app抓取 - so文件协议破解

题目地址 http://match.yuanrenxue.com/match/11这是个app题目,先下载下来安装到测试手机上 安装完成后的app界面长这样 打开之后是这样的: 要求已经简单明了了。 二话不说先反编译app 不出意外的是没出意外,源代码里面没啥混淆,所有东西都展示的明明白白的。 "…

redis — 基于Spring Boot实现redis延迟队列

1. 业务场景 延时队列场景在我们日常业务开发中经常遇到,它是一种特殊类型的消息队列,它允许把消息发送到队列中,但不立即投递给消费者,而是在一定时间后再将消息投递给消费者。延迟队列的常见使用场景有以下几种: 在…

C语言快速回顾(一)

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。C/C是音视频必…

2023国赛数学建模A题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

版本控制工具——git

版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的…

IPv4分组

4.3.1 IPv4分组 IP协议定义数据传送的基本单元——IP分组及其确切的数据格式 1. IPv4分组的格式 IPv4分组由首部和数据部分(TCP、UDP段)组成,其中首部分为固定部分(20字节)和可选字段(长度可变&#xff0…

【Java】使用JavaSE实现图书管理系统详解

目录 1.前言 2.初步框架搭建 3.Book 书架和书架里的书 3.1书本 3.2书架 4.User 用户和管理员 4.1初步想法 4.2用户 4.3管理员 4.4main函数中如何调用不同的成员 5.方法的调用 5.1接口 5.2增加图书 5.3借阅图书 5.4删除图书 5.5退出系统 5.6查找图书 5.7归还图书…

ArrayList浅拷贝clone,Kotlin

ArrayList浅拷贝clone&#xff0c;Kotlin import kotlin.collections.ArrayListfun main() {var list ArrayList<MyData>()for (i in 0..<3) {list.add(MyData(i, 0))}//浅拷贝list到copyListvar copyList list.clone()println(list)println(copyList)println("…