建网站的网站/我要下载百度

建网站的网站,我要下载百度,可以做描文本的网站,公司网站的后台工厂模式(Factory Pattern)是设计模式中的一种创建型模式,它通过工厂方法来创建对象,而不是让客户端代码直接实例化对象。这样可以避免客户端与具体类的紧密耦合,从而提高代码的灵活性、可维护性和扩展性。工厂模式能够…

工厂模式(Factory Pattern)是设计模式中的一种创建型模式,它通过工厂方法来创建对象,而不是让客户端代码直接实例化对象。这样可以避免客户端与具体类的紧密耦合,从而提高代码的灵活性、可维护性和扩展性。工厂模式能够将对象的创建过程封装起来,使得系统可以在不修改客户端代码的情况下增加新的产品。

工厂模式主要分为以下几种类型:

  1. 简单工厂模式(Simple Factory Pattern)
  2. 工厂方法模式(Factory Method Pattern)
  3. 抽象工厂模式(Abstract Factory Pattern)

本文将深入探讨这些模式,并通过C#示例代码进行说明。


1. 简单工厂模式(Simple Factory Pattern)

简单工厂模式是一种最简单的工厂模式,它通过一个工厂类来根据传入的条件创建不同的产品对象。客户端不需要直接创建对象,而是通过工厂类获取所需的产品对象。

优点:
  • 客户端代码不需要关心产品的具体实现,只需要通过工厂类来创建对象。
  • 集中管理产品的创建过程,便于修改和维护。
缺点:
  • 工厂类随着产品种类的增多会变得庞大,不易维护。
  • 每当新增产品时,需要修改工厂类,违反了开闭原则。
C# 示例代码:
// 产品接口
public interface IProduct
{void Use();
}// 具体产品A
public class ProductA : IProduct
{public void Use(){Console.WriteLine("使用产品A");}
}// 具体产品B
public class ProductB : IProduct
{public void Use(){Console.WriteLine("使用产品B");}
}// 简单工厂类
public class ProductFactory
{public static IProduct CreateProduct(string type){if (type == "A"){return new ProductA();}else if (type == "B"){return new ProductB();}else{throw new ArgumentException("未知的产品类型");}}
}// 客户端代码
public class Client
{public static void Main(string[] args){IProduct productA = ProductFactory.CreateProduct("A");productA.Use();IProduct productB = ProductFactory.CreateProduct("B");productB.Use();}
}

在这个示例中,ProductFactory 类根据传入的参数来创建不同的 IProduct 实例。客户端通过工厂类来获取产品对象,而不需要关心具体的实现类。


2. 工厂方法模式(Factory Method Pattern)

工厂方法模式是对简单工厂模式的改进,它通过定义一个工厂接口,让子类决定创建哪个具体产品。每个具体工厂负责创建一个特定的产品对象,避免了简单工厂中工厂类做大量条件判断的情况。

优点:
  • 每个工厂类只负责创建一个产品,符合单一职责原则。
  • 可以通过新增工厂类来扩展新的产品,符合开闭原则。
缺点:
  • 每增加一种产品类型,都需要增加一个工厂类,导致类的数量增多,系统复杂度上升。
C# 示例代码:
// 产品接口
public interface IProduct
{void Use();
}// 具体产品A
public class ProductA : IProduct
{public void Use(){Console.WriteLine("使用产品A");}
}// 具体产品B
public class ProductB : IProduct
{public void Use(){Console.WriteLine("使用产品B");}
}// 抽象工厂接口
public interface IFactory
{IProduct CreateProduct();
}// 具体工厂A
public class FactoryA : IFactory
{public IProduct CreateProduct(){return new ProductA();}
}// 具体工厂B
public class FactoryB : IFactory
{public IProduct CreateProduct(){return new ProductB();}
}// 客户端代码
public class Client
{public static void Main(string[] args){IFactory factoryA = new FactoryA();IProduct productA = factoryA.CreateProduct();productA.Use();IFactory factoryB = new FactoryB();IProduct productB = factoryB.CreateProduct();productB.Use();}
}

在上面的示例中,FactoryAFactoryB 各自负责创建不同的产品,客户端通过不同的工厂类来获取所需的产品实例。


3. 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是工厂方法模式的扩展,它通过提供一个抽象工厂接口来创建一系列相关的产品,而不需要指定它们的具体类。每个工厂可以创建多个产品,通常这些产品是相关或有依赖关系的。

优点:
  • 客户端通过抽象工厂创建一系列相关产品,而不需要了解产品的具体实现。
  • 可以确保产品之间的兼容性,并且便于扩展新的产品系列。
缺点:
  • 每增加一个产品系列,就需要增加一个工厂类,导致类的数量增多,系统复杂度上升。
C# 示例代码:
// 抽象产品A
public interface IProductA
{void Use();
}// 具体产品A1
public class ProductA1 : IProductA
{public void Use(){Console.WriteLine("使用产品A1");}
}// 具体产品A2
public class ProductA2 : IProductA
{public void Use(){Console.WriteLine("使用产品A2");}
}// 抽象产品B
public interface IProductB
{void Use();
}// 具体产品B1
public class ProductB1 : IProductB
{public void Use(){Console.WriteLine("使用产品B1");}
}// 具体产品B2
public class ProductB2 : IProductB
{public void Use(){Console.WriteLine("使用产品B2");}
}// 抽象工厂接口
public interface IAbstractFactory
{IProductA CreateProductA();IProductB CreateProductB();
}// 具体工厂1
public class ConcreteFactory1 : IAbstractFactory
{public IProductA CreateProductA(){return new ProductA1();}public IProductB CreateProductB(){return new ProductB1();}
}// 具体工厂2
public class ConcreteFactory2 : IAbstractFactory
{public IProductA CreateProductA(){return new ProductA2();}public IProductB CreateProductB(){return new ProductB2();}
}// 客户端代码
public class Client
{public static void Main(string[] args){IAbstractFactory factory1 = new ConcreteFactory1();IProductA productA1 = factory1.CreateProductA();IProductB productB1 = factory1.CreateProductB();productA1.Use();productB1.Use();IAbstractFactory factory2 = new ConcreteFactory2();IProductA productA2 = factory2.CreateProductA();IProductB productB2 = factory2.CreateProductB();productA2.Use();productB2.Use();}
}

在上述示例中,ConcreteFactory1ConcreteFactory2 分别创建一系列相关的产品对象。客户端可以选择不同的工厂来获取产品系列,确保产品的兼容性。


总结

  • 简单工厂模式:适用于产品种类较少的情况,通过一个工厂类来创建不同的产品。
  • 工厂方法模式:适用于产品种类较多的情况,通过具体工厂类来创建不同的产品,符合开闭原则。
  • 抽象工厂模式:适用于需要创建多个相关产品系列的情况,确保不同系列的产品兼容性。

通过工厂模式,程序的扩展性和灵活性得到了提升。选择合适的工厂模式可以帮助我们在项目中灵活、便捷地管理对象的创建过程。

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

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

相关文章

SpringCloud系列教程(十四):Sentinel持久化

Sentinel之前已经搭建和应用成功了,但是它有一个很大的缺点就是官方没有提供持久化的方案,从项目源码上看感觉这款工具也没有完成的太好,所以需要我们去对它进行二次开发。要补充的功能大概如下: 1、将Sentinel接入nacos中&#…

Go语言环境搭建并执行第一个Go程序

目录 一、Windows环境搭建 二、vscode安装插件 三、运行第一个go程序 一、Windows环境搭建 下载Go:All releases - The Go Programming Language 这里是Windows搭建,选择的是windows-amd64.msi,也可以选择zip直接解压缩到指定目录 选择msi…

Java数据结构第二十三期:Map与Set的高效应用之道(二)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、哈希表 1.1. 概念 1.2. 冲突 1.3. 避免冲突 1.4. 解决冲突 1.5. 实现 二、OJ练习 2.1. 只出现一次的数字 2.2. 随机链表的复制 2.3. 宝石与石头 一、哈希表 1.1. 概念 顺序结构以及平衡树中…

OpenHarmony子系统开发 - Rust编译构建指导

OpenHarmony子系统开发 - Rust编译构建指导 一、Rust模块配置规则和指导 概述 Rust是一门静态强类型语言,具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C…

STM32驱动代码规范化编写指南(嵌入式C语言方向)

点击下面图片,为您提供全新的嵌入式学习路线 文章目录 一、命名规范体系1.1 变量/函数命名1.2 宏定义规范1.3 类型定义 二、代码结构组织2.1 文件组织结构2.2 头文件规范模板 三、注释体系构建3.1 Doxygen风格示例3.2 复杂逻辑注释 四、硬件抽象层设计4.1 寄存器封…

Trae与Builder模式初体验

说明 下载的国际版:https://www.trae.ai/ 建议 要选新模型 效果 还是挺不错的,遇到问题反馈一下,AI就帮忙解决了,真是动动嘴(打打字就行了),做些小的原型效果或演示Demo很方便呀&#xff…

【设计模式】《设计模式:可复用面向对象软件的基础》:设计模式怎样解决设计问题?

文章目录 ⭐前言⭐一、设计模式怎样解决设计问题?🌟1、寻找合适的对象🌟2、决定对象的粒度🌟3、指定对象接口🌟4、描述对象的实现🌟5、运用复用机制✨(1)针对接口编程,而不是针对实现编程。✨(2…

【项目管理git】git学习

ps:所有东西都是个人理解 文章目录 一、git是什么,它用来做什么?二、相关知识库2.1 简单的linux指令2.2 git配置指令2.3 git常见的指令2.3.1 Git的上传原理2.3.2 版本回退相关内容 2.4 设置远程地址,本地上传到github2.4.1 ssh相…

python速通小笔记-------1.容器

1.字符串的标识 字符串需要用“”标识。 与c不同,python 写变量时 不需要标明数据类型每一行最后不需要加; 2.print函数的使用 与c中的printf函数一致 3.运算符 4.字符串str操作 1. 实现字符串拼接 2.% 实现字符串初始化 %s占位会把变量强制转变为…

零基础上手Python数据分析 (2):Python核心语法快速入门

写在前面 场景:每周销售数据报表整理 任务描述: 你需要每周从多个Excel文件中汇总销售数据,计算各项指标(销售额、订单量、客单价等),并生成周报。Excel操作痛点: 文件太多,手动打开复制粘贴,效率低下,容易出错。 多个Excel文件,每个都要打开、筛选、复制数据,重复…

【PHP】获取PHP-FPM的状态信息

文章目录 一、前言二、环境三、过程1)修改PHP-FPM配置文件2)修改Nginx配置文件3)访问页面4)修改状态页面端口 一、前言 PHP-FPM内置有一个状态页面,通过这个页面可以获取到FPM的一些状态信息(见下图&#…

搭建Spring Boot Admin监控系统

什么是Spring Boot Admin Spring Boot Admin 是一个用于管理和监控 Spring Boot 应用程序的开源工具。它提供了一个用户友好的 Web 界面,用于集中管理和监控多个 Spring Boot 应用程序的运行状态、健康状况、日志、配置等信息。 Spring Boot Admin 的核心功能 应用…

[CISCN 2022 初赛]ezpop(没成功复现)

打开在线环境可以看到&#xff1a; 记得之前做过一个类似的就是有点像照着漏洞去复现。应该可以直接在网上找到链子去打。 www.zip查看路由是 Index/test&#xff0c;然后 post 传参 a&#xff1a; exp&#xff08;参考了别的大神的wp&#xff09;&#xff1a; <?php //…

C 语 言 --- 二 维 数 组 的 应 用

C 语 言 --- 二 维 数 组 的 应 用 第 一 题 - - - 冒 泡 排 序冒 泡 排 序冒 泡 排 序 的 原 理 第 二 题 - - - 回 型 矩 阵特 点 第 三 题 - - - 蛇 形 矩 阵总结 &#x1f4bb;作者简介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &…

5G核心网实训室搭建方案:轻量化部署与虚拟化实践

5G核心网实训室 随着5G技术的广泛应用&#xff0c;行业对于5G核心网人才的需求日益增长。高校、科研机构和企业纷纷建立5G实训室&#xff0c;以促进人才培养、技术创新和行业应用研究。IPLOOK凭借其在5G核心网领域的深厚积累&#xff0c;提供了一套高效、灵活的5G实训室搭建方…

寄生虫仿生算法:基于寄生虫特征的算法设计

寄生虫仿生算法:基于寄生虫特征的算法设计 基于寄生虫行为特征的仿生算法设计 import random import numpy as npclass EnhancedPBOA:def __init__(self, host_env, max_generations, population_size50):self.host_env host_envself.max_generations max_generationsself.p…

【医学影像 AI】基于深度学习的 ROP 病变检测图像评估系统

【医学影像 AI】基于深度学习的 ROP 病变检测图像评估系统 0. 论文简介0.1 基本信息0.2 摘要 1. 引言2. 材料与方法2.1 研究人群2.2 疾病分类与参考标准的制定2.3 深度学习系统开发2.4 定量严重程度评分2.5 数据分析 3. 结果4. 讨论6. 参考文献 0. 论文简介 0.1 基本信息 201…

Cursor初体验:excel转成CANoe的vsysvar文件

今天公司大佬先锋们给培训了cursor的使用&#xff0c;还给注册了官方账号&#xff01;跃跃欲试&#xff0c;但是测试任务好重&#xff0c;结合第三方工具开发也是没有头绪。 但巧的是&#xff0c;刚好下午有同事有个需求&#xff0c;想要把一个几千行的excel转成canoe的系统变…

每日一题---单词搜索(深搜)

单词搜索 给出一个二维字符数组和一个单词&#xff0c;判断单词是否在数组中出现&#xff0c; 单词由相邻单元格的字母连接而成&#xff0c;相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。 数据范围&#xff1a; 0 < 行长度 < 100 0 < 列长度 <…

【深度学习】多源物料融合算法(一):量纲对齐常见方法

目录 一、引言 二、量纲对齐常见方法 2.1 Z-score标准化Sigmoid归一化 2.2 Min-Max 归一化 2.3 Rank Transformation 2.4 Log Transformation 2.5 Robust Scaling 3、总结 一、引言 类似抖音、快手、小红书等产品的信息流推荐业务&#xff0c;主要通过信息流广告、信…