工厂设计模式的实现与应用场景分析

工厂设计模式的实现与应用场景分析

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

工厂设计模式(Factory Pattern)是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂模式让类的实例化推迟到子类,从而使代码更具扩展性和灵活性。本文将介绍工厂设计模式的基本实现方法、应用场景,并通过Java代码示例详细说明。

工厂设计模式的基本实现

工厂设计模式主要分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。我们将逐一进行介绍和分析。

1. 简单工厂模式

简单工厂模式通过一个工厂类,根据传入的参数,决定创建哪一种产品的实例。这个模式不是真正的设计模式,而是一种编程习惯。

示例代码:

package cn.juwatech.factory;

interface Product {
    void create();
}

class ProductA implements Product {
    @Override
    public void create() {
        System.out.println("ProductA created");
    }
}

class ProductB implements Product {
    @Override
    public void create() {
        System.out.println("ProductB created");
    }
}

class SimpleFactory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ProductA();
        } else if (type.equals("B")) {
            return new ProductB();
        }
        return null;
    }
}

public class FactoryTest {
    public static void main(String[] args) {
        Product productA = SimpleFactory.createProduct("A");
        productA.create();
        
        Product productB = SimpleFactory.createProduct("B");
        productB.create();
    }
}
2. 工厂方法模式

工厂方法模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

示例代码:

package cn.juwatech.factory;

interface Product {
    void create();
}

class ProductA implements Product {
    @Override
    public void create() {
        System.out.println("ProductA created");
    }
}

class ProductB implements Product {
    @Override
    public void create() {
        System.out.println("ProductB created");
    }
}

interface Factory {
    Product createProduct();
}

class FactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

class FactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

public class FactoryMethodTest {
    public static void main(String[] args) {
        Factory factoryA = new FactoryA();
        Product productA = factoryA.createProduct();
        productA.create();
        
        Factory factoryB = new FactoryB();
        Product productB = factoryB.createProduct();
        productB.create();
    }
}
3. 抽象工厂模式

抽象工厂模式通过一个接口创建一系列相关或相互依赖的对象,而无需指定它们的具体类。它提供一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。

示例代码:

package cn.juwatech.factory;

interface ProductA {
    void createA();
}

class ProductA1 implements ProductA {
    @Override
    public void createA() {
        System.out.println("ProductA1 created");
    }
}

class ProductA2 implements ProductA {
    @Override
    public void createA() {
        System.out.println("ProductA2 created");
    }
}

interface ProductB {
    void createB();
}

class ProductB1 implements ProductB {
    @Override
    public void createB() {
        System.out.println("ProductB1 created");
    }
}

class ProductB2 implements ProductB {
    @Override
    public void createB() {
        System.out.println("ProductB2 created");
    }
}

interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

class Factory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }
    
    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}

class Factory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }
    
    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

public class AbstractFactoryTest {
    public static void main(String[] args) {
        AbstractFactory factory1 = new Factory1();
        ProductA productA1 = factory1.createProductA();
        productA1.createA();
        ProductB productB1 = factory1.createProductB();
        productB1.createB();
        
        AbstractFactory factory2 = new Factory2();
        ProductA productA2 = factory2.createProductA();
        productA2.createA();
        ProductB productB2 = factory2.createProductB();
        productB2.createB();
    }
}

应用场景分析

  1. 简单工厂模式:适用于工厂类负责创建的对象较少的场景。由于工厂类集中了所有实例的创建逻辑,因此不易于扩展,且不符合开闭原则。

  2. 工厂方法模式:适用于需要创建的对象具有较多变种的场景。每新增一种产品,只需添加对应的具体工厂类,符合开闭原则,扩展性较好。

  3. 抽象工厂模式:适用于需要创建一系列相关或相互依赖对象的场景。它能保证客户端使用的对象之间的一致性,是一种强大的创建型模式。

结论

工厂设计模式在面向对象编程中有着广泛的应用,它们不仅能简化对象的创建过程,还能提高代码的扩展性和维护性。通过理解和掌握这三种工厂模式,开发者可以在不同场景下灵活运用,提升系统的设计质量。微赚淘客系统3.0小编出品,必属精品!

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

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

相关文章

8.x86游戏实战-OD详解

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:7.x86游戏实战-C实现跨进程读写-跨进程写内存 工具下载:下载 OllyI…

【信即是功夫】人皆有良知在心中

良知就是做人、做事的准则,良知就是天理;实实在在地自信 每个人心中都有一个圣人,只因自己不能真的相信,把这个圣人埋没了 良知在每个人心中,无论你如何做,也无法泯灭它。即使身为盗贼的人,他…

【LeetCode的使用方法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🔮LeetCode的使用方法 🔮LeetCode 是一个在线编程平台,广泛…

掌握Go语言邮件发送:net/smtp实用教程与最佳实践

掌握Go语言邮件发送:net/smtp实用教程与最佳实践 概述基本配置与初始化导入net/smtp包设置SMTP服务器基本信息创建SMTP客户端实例身份验证 发送简单文本邮件配置发件人信息构建邮件头部信息编写邮件正文使用SendMail方法发送邮件示例代码 发送带附件的邮件邮件多部分…

STM32之五:TIM定时器(2-通用定时器)

目录 通用定时器(TIM2~5)框图 1、 输入时钟源选择 2、 时基单元 3 、输入捕获:(IC—Input Capture) 3.1 输入捕获通道框图(TI1为例) 3.1.1 滤波器: 3.1.2 边沿检测器&#xf…

CesiumJS【Basic】- #058 绘制网格填充多边形(Entity方式)-使用shader

文章目录 绘制网格填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制网格填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制网格填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;// 创建 Cesium Viewer 实例…

安装Gitlab+Jenkins

GItlab概述 GitLab概述: 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。 Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。 GitLab拥有与…

ESP32-VScode环境设置

目录 前言 一、安装VSCode 二、安装ESP32环境 1.安装ESP-IDF 2.ESP-IDF设置 3:开始配置环境 4.打开example进行验证 5.烧录 6.调整波特率 总结 前言 环境:Visual Studio Code 芯片:ESP32 说实话,这是我装的时间最长的一个环境&…

C++ 和C#的差别

首先把眼睛瞪大,然后憋住一口气,读下去: 1、CPP 就是C plus plus的缩写,中国大陆的程序员圈子中通常被读做"C加加",而西方的程序员通常读做"C plus plus",它是一种使用非常广泛的计算…

【分布式系统】监控平台Zabbix对接grafana

以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 一.安装grafana并启动 添加一台服务器192.168.80.104 初始化操作 systemctl disable --now firewalld set…

运维锅总浅析云原生DevOps工具

本文从Tekton与Kubevela、Jenkins、GitLab CI的区别与联系对常见的云原生DevOps工具进行对比分析,最后给出DevOps工具选型思路。希望对您有所帮助! 一、DevOps简介 DevOps是一种结合了软件开发(Development)和IT运维&#xff08…

【代码随想录】【算法训练营】【第56天】 [卡码98]所有可达路径

前言 思路及算法思维,指路 代码随想录。 题目来自 卡码网。 day 56,周二,继续ding~ 题目详情 [卡码98] 所有可达路径 题目描述 卡码98 所有可达路径 解题思路 前提: 思路: 重点: 代码实现 C语言…

python - 列表 / 元组 / 字符串

一.列表 由于pyhon的变量没有数据类型,所以python是没有数组的(因为数组只能存放一种类型,要么全部存放整型,要么全部存放浮点型),只有列表list,所以整数,浮点数,字符串…

【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer

【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主…

【UE5.3】笔记6-创建可自由控制Pawn类

搭建场景 搭建一个场景:包含地板、围墙。可以根据喜好加一些自发光的效果。 增加食物 创建食物蓝图类,在场景里放置一些食物以供我们player去吃掉获取分值。 创建可控制的layer 我们先右键创建一个蓝图继承自pawn类,起名BP_Player&#xf…

视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

视图库对接系列(本级)注册 在之前的步骤中,我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。 GA-T 1400中的步骤如下: 这里的话,我们实现的简单点, 我们不进去鉴权,也就是设备或平台找我们注册的话&…

VideoPrism——探索视频分析领域模型的算法与应用

概述 论文地址:https://arxiv.org/pdf/2402.13217.pdf 视频是我们观察世界的生动窗口,记录了从日常瞬间到科学探索的各种体验。在这个数字时代,视频基础模型(ViFM)有可能分析如此海量的信息并提取新的见解。迄今为止,…

Rustdesk如何编译代码实现安装后不会显示主界面,不会在右下角出现托盘图标,作为后台服务运行

环境: Rustdesk1.1.9 问题描述: Rustdesk如何编译代码实现安装后不会显示主界面,不会在右下角出现托盘图标,作为后台服务运行 解决方案: 可以自定义进程名称和图标,不会显示主界面,不会在…

小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友,喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…

uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因:vite 中不支持,换成 ::v-deep 或:deep即可