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

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

  • 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.mfbz.cn/a/73215.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“深入解析Maven:安装、创建项目和依赖管理的完全指南“

目录 引言Maven的安装创建Maven项目之前的装备工作Eclipse创建新的Maven项目项目依赖管理 总结 引言 Maven是一个流行的项目管理工具,被广泛用于Java项目的构建、依赖管理和部署。它提供了一种简单而强大的方式来管理项目的各个方面,使开发人员能够更专…

虹科展会 | 自动驾驶展品:上海汽车测试展精彩回顾

2023年8月9日-8月11日,上海国际汽车测试及质量监控博览会在上海圆满落幕。本次展会提供了一个了解最新汽车测试及质量监控技术、产品和趋势的机会,同时也是汽车测试及质量监控领域的专业人士和业内人士的重要交流平台。 雅名特是虹科旗下子公司&#xff…

2023年国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法&#xff0c…

改造旧项目-长安分局人事费用管理系统

一、系统环境搭建 1、搭建前台环境 vue3vite构建项目复制“银税系统”页面结构,包括:路由、vuex存储、菜单、登录(复制一个干净的空架子) 2、搭建后台环境 新三大框架 SSMP聚合工程:common、admin,新的…

《算法竞赛·快冲300题》每日一题:“房间划分”

《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 房…

全文检索与日志管理 Elasticsearch(上)

一、Elasticsearch介绍 1.1 全文检索索引 Elasticsearch是一个全文检索服务器,全文检索是一种非结构化数据的搜索方式。 那么什么是结构化数据和非结构化数据呢? 结构化数据:指具有固定格式固定长度的数据,如数据库中的字段。 …

影响股票数据接口l2传输数据快慢因素有哪些?(l2数据接口)

股票数据接口l2是一种用于获取股票市场相关数据的编程接口。它允许开发者通过编程的方式获取、查询、订阅和更新股票相关数据,如股票价格、成交量、财务数据等,并将这些数据用于自己的应用或系统中。l2数据接口通常提供实时行情数据、历史行情数据、财务…

【深度学习】多粒度、多尺度、多源融合和多模态融合的区别

多粒度(multiresolution)和多尺度(multiscale) 多粒度(multiresolution)和多尺度(multiscale)都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度&#xff1…

为什么要学PMP项目管理?

为什么要学习PMP呢,主要有以下五点: 01提升个人能力 PMP是一个系统学习的过程,充分理解各个项目管理的过程以及项目管理的各个过程组、知识领域等,可以从理论上掌握项目经理应具有的理论素质。能够知道如何对执行的项目进行系统…

django实现登录和登录的鉴权

1、创建数据库的管理员表 在models.py 中定义admin表,为了简单,表里只有用户名和密码还有默认加的id 三个字段 from django.db import models# Create your models here.class Admin(models.Model):username models.CharField(verbose_name"用户…

leetcode剑指 Offer 05. 替换空格(两种方法)

题目:leetcode剑指 Offer 05. 替换空格 描述: 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s “We are happy.” 输出:“We%20are%20happy.” 思路: 第一…

【vue】alert弹窗太死板?试试这种方法(附代码)

alert(response.data.message); 新方法: this.$message.error(请检查您输入的的用户名和密码!);

用户端Web自动化测试-L1

目录: Web自动化测试价值与体系环境安装与使用自动化用例录制自动化测试用例结构分析web浏览器控制常见控件定位方法强制等待与隐式等待常见控件交互方法自动化测试定位策略搜索功能自动化测试用户端Web自动化测试 1.Web自动化测试价值与体系 功能测试场景: UI 自…

【机密计算实践】OPEN Enclave SDK 安装与构建

机密计算是基于硬件支持的可信执行环境的,比如 Intel SGX 硬件技术上面的 enclave 以及 Arm Trustzone 上的 OT-TEE,不过这些异构的 TEE 之间差异还是蛮大的,所以亟需一种能够屏蔽 TEE 差异软件中间件或者 SDK,这就是本文将要提到…

使用BP插件captcha-killer识别图片验证码绕过系统验证码机制

使用BP插件captcha-killer绕过验证码 前置条件 1、下载安装插件 burp2020前使用:https://github.com/c0ny1/captcha-killer/tree/0.1.2 burp2020后使用:https://github.com/Ta0ing/captcha-killer-java8 2、导入插件 分为三个部分:上面为验…

spring之AOP简单介绍

1.AOP的概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,…

深度学习部署:FastDeploy部署教程(CSharp版本)

FastDeploy部署教程(CSharp版本) 1. FastDeploy介绍 FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过 🔥160 Text,Vision, Speech和跨模态模型📦开箱即用的部署体验&#xf…

FreeRTOS(软件定时器)

资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、软件定时器的概念 1、软件定时器的概念 2、软件定时器支持功能 3、单次模式与周期模式 4、定时器守护任务 二、软件定时器的应用 1、应用场景 2、软件定时器的精度 3、回调…

OptaPlanner笔记6 N皇后

N 个皇后 问题描述 将n个皇后放在n大小的棋盘上,没有两个皇后可以互相攻击。 最常见的 n 个皇后谜题是八个皇后谜题,n 8: 约束: 使用 n 列和 n 行的棋盘。在棋盘上放置n个皇后。没有两个女王可以互相攻击。女王可以攻击同一水…

YOLO v8目标跟踪详细解读(二)

上一篇,结合代码,我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解,下面我们将对跟踪中出现的卡尔曼滤波进行解读。 1.卡尔曼滤波器介绍 卡尔曼滤波(kalman Filtering)是一种利用线性…
最新文章