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

news2024/11/23 10:27:40

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

  • 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.coloradmin.cn/o/877215.html

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

相关文章

windows10和linux18.04中配置mmhuman3d

分类:动作捕捉 github地址:https://github.com/open-mmlab/mmhuman3d 所需环境: Windows10,CUDA11.6,conda 4.13.0,Visual Studio 2017; Ubuntu18.04,conda22.9.0,CUDA11…

人工智能能够通过所有[创造力测试]

沃顿商学院教授Ethan Mollick emollick 分享了三篇新的实验性论文,证明了AI在实际情境中的创造力。 https://www.oneusefulthing.org/p/automating-creativity “GPT-4 现在在替代用途测试中击败了 91% 的人类,在托伦斯创造性思维测试中击败了 99% 的人类…

每天一道leetcode:1466. 重新规划路线(图论中等广度优先遍历)

今日份题目: n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部决定重新规划路线,以…

网络安全专业术语英文缩写对照表

因在阅读文献过程中经常遇到各种专业缩写,所以把各种缩写总结了一下。 因能力有限,错误在所难免,欢迎进行纠错与补充:https://github.com/piaolin/CSAbbr 渗透相关 缩写全称解释备注XSSCross Site Script Attack跨站脚本攻击为…

前端食堂技术周刊第 94 期:TS 5.2 RC、从零实现 RSC、Redux 迁移至 ESM 之旅、HTML 满汉全席

美味值:🌟🌟🌟🌟🌟 口味:葡茉美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…

揭秘国产操作系统的黄金测试利器:探索开源测试工具的神秘世界

揭秘国产操作系统的黄金测试利器:探索开源测试工具的神秘世界 文章目录 1.前言2.国产操作系统现状的深度解析3.国产操作系统的质量保障神器(开源测试工具)4.开源测试工具的重要性5.国产操作系统如何利用开源测试工具进行黄金测试6.国产操作系统的开源测试工具整合方…

python安装第三方包时报错:...\lib\site-packages\pip\_vendor\urllib3\response.py...

安装redis第三方包: pip install redis报错现象: 解决方法:使用以下命令可成功安装 pip install redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

IT运维:使用数据分析平台监控深信服防火墙

概述 深信服防火墙自身监控可以满足绝大部分需求,比如哪个应用占了最大带宽,哪个用户访问了哪些网站?这里我们为什么使用鸿鹄呢?因为我们要的是数据的处理和分析,比如某个用户在某个事件都做了哪些行为,这个…

OpenCV图像处理——轮廓检测

目录 图像的轮廓查找轮廓绘制轮廓 轮廓的特征轮廓面积轮廓周长轮廓近似凸包边界矩形最小外接圆椭圆拟合直线拟合 图像的矩特征矩的概念图像中的矩特征 图像的轮廓 查找轮廓 binary,contours,hierarchycv.findContours(img,mode,method)绘制轮廓 cv.drawContours(img,coutours…

找不到mfc140u.dll怎么办?mfc140u.dll丢失怎样修复?简单三招搞定

最近我遇到了一个问题,发现我的电脑上出现了mfc140u.dll文件丢失的错误提示。这个错误导致一些应用程序无法正常运行,让我感到非常困扰。经过一番研究和尝试,我终于成功修复了这个问题,并从中总结出了一些心得。 mfc140u.dll丢失原…

Claude2 Api接入方案

一,实现目标 接入钉钉机器人支持群聊和私聊 网上看了很多方案,因为Claude的api申请难度非常大,大部分都是说使用Slack,但是Slack只能免费使用一个月。作为一个完美主义怎么可能允许这样的事情发生。何如处理,抓网页。…

基于Redis实现全局唯一Id

微信公众号访问地址:基于Redis实现全局唯一Id 推荐文章: 1、使用原生Redis命令实现分布式锁 ​ 2、为什么引入Redisson分布式锁? 3、SpringBoot整合多数据源,并支持动态新增与切换(详细教程) 4、Sprin…

【计算机网络】Udp详解

前言 上几文章我们讲解了应用层协议Http和Https,要知道应用层协议有很多,这些都是程序员自己定制的,而真正要传输的时候,是要在操作系统的传输层进行的,今天我们就来学习一下传输层协议Udp的 标识一个通信 要进行跨…

黑马项目一阶段面试 自我介绍篇

面试官你好,我叫xxx,是来自xxxx的本科毕业生。我通过招聘网站/内推/线下招聘了解到的贵司,我具有扎实的Java后端的基础功底,基本掌握JavaSE、JavaEE流行技术的使用,并且我比较好学,心态也很乐观积极&#x…

docker nginx ssl设置

使用docker运行nginx,配置代理,和ssl设置,进行https访问 一 准备 本次在centos环境中 1.已安装docker,docker-compose 2.运行了一个后端服务容器,提供基本的接口访问【可选】 3.一个域名(已经解析到服…

Linux命令200例:date用于显示和设置系统的日期和时间

🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…

MongoDB 更新文档(更新数组对象中的元素)

之前我们介绍了如何更新文档,并简单的介绍了更新文档时可以使用选项进行指定当更新内容不存在时,可以进行新增文档。具体可以参考: MongoDB 更新文档(更新一条文档)https://blog.csdn.net/m1729339749/article/details/129983304 最近遇到了…

Android实现超出固定行数折叠文字“查看全文“、“收起全文“

先上效果图 分析问题 网上有很多关于这个的代码,实现都过于复杂了,github上甚至还看到一篇文章600多行代码,结果一跑起来全是bug。还是自己写吧!!! 如果我们需要换行的"查看全文"、"收起全…

用汇编指令求两个数的最大公约数 求for循环实现1~100

1.用汇编指令求两个数的最大公约数 2.用汇编指令求for循环实现1~100

【校招VIP】测试计划之黑盒测试白盒测试

考点介绍: 黑盒测试&白盒测试是大厂和三四线公司校招的必考点。黑盒是以结果说话,白盒往往需要理解实现逻辑。现在商业项目的接口测试往往以白盒为主,也就是需要测试同学自己观察和修改数据库的值进行用例的测试。 但是无论采用哪种测试方…