工厂模式(设计模式)

使用工厂模式创建对象的好处在于,具体的实现类可以随意换(解耦)。因为在返回创建的对象的时候,我将此对象向上转型。那么如果需求变动,我可以再写一个这个接口的实现类,只用修改这个工厂类中的代码。而使用这个工厂类创建对象后的各种逻辑代码我都可以不用改。
工厂模式(Factory Pattern)是一种创建型设计模式,旨在提供一个创建对象的接口,而不指定具体类。工厂模式可以分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。下面将详细介绍这三种模式及其使用场景。
简单工厂模式:适用于对象创建逻辑相对简单且变化较少的情况。是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例 可以生产结构中的任意产品,不能增加新的产品
抽象工厂模式: 提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类,生产多个系列产品 生产不同产品族的全部产品,不能新增产品,可以新增产品族。适用于创建相关或依赖对象的场景,通过增加新的具体工厂来支持不同的产品族
工厂方法模式:适用于需要扩展产品家族的情况,通过增加新的具体工厂来实现。
每种工厂模式都有其独特的使用场景和优缺点,选择合适的模式可以提高代码的灵活性和可维护性。

  1. 简单工厂模式
    工厂类通常是单一的,通过传入参数控制创建哪种具体产品。
    使用静态方法来实现工厂功能。
    扩展性较差,新增产品时需要修改工厂类。
  2. 工厂方法模式
    通过抽象工厂方法定义创建对象的接口。
    每个具体工厂类负责创建一个具体产品的实例。
    扩展性好,新增产品只需添加具体工厂类,符合开闭原则。
  3. 抽象工厂模式
    提供一个接口用于创建一系列相关或互相依赖的对象。
    涉及多个抽象产品接口和具体工厂类。
    强调产品族的概念,保证一系列产品的一致性和兼容性。
    选择哪种工厂模式取决于实际需求和应用场景。如果只是需要简单的对象创建,可以使用简单工厂模式;如果需要扩展性和灵活性,可以考虑使用工厂方法模式;如果涉及多个产品族且需要保证产品的一致性,则抽象工厂模式是合适的选择。

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

定义
简单工厂模式由一个工厂类根据传入的参数决定创建哪一种产品类的实例。它通常不是一种真正的设计模式,更像是一种编程习惯。
结构
工厂类(Factory Class):负责创建具体的产品实例。
产品类(Product Class):被创建的对象,通常是一些具有共同接口或父类的具体类。
示例
假设我们有一个接口 Product 和两个实现类 ConcreteProductA 和 ConcreteProductB。
// 产品接口

interface Product {void use();
}// 具体产品A
class ConcreteProductA implements Product {public void use() {System.out.println("Using Product A");}
}// 具体产品B
class ConcreteProductB implements Product {public void use() {System.out.println("Using Product B");}
}// 工厂类
class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();}throw new IllegalArgumentException("Unknown product type");}
}// 客户端代码
public class Client {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.use();Product productB = SimpleFactory.createProduct("B");productB.use();}
}

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

工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
抽象工厂(Creator):声明工厂方法,该方法返回一个新创建的产品对象。
具体工厂(ConcreteCreator):实现工厂方法来创建具体的产品对象。
产品接口(Product):定义产品的接口。
具体产品(ConcreteProduct):实现产品接口的具体类。
示例
假设我们继续使用上面的 Product 接口和具体实现类 ConcreteProductA 和 ConcreteProductB。

// 抽象工厂
abstract class Factory {public abstract Product createProduct();public void someOperation() {// 使用产品Product product = createProduct();product.use();}
}// 具体工厂A
class ConcreteFactoryA extends Factory {public Product createProduct() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteFactoryB extends Factory {public Product createProduct() {return new ConcreteProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();factoryA.someOperation();Factory factoryB = new ConcreteFactoryB();factoryB.someOperation();}
}

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

抽象工厂模式提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们具体的类。
抽象工厂(AbstractFactory):声明创建一组产品的方法,每个方法对应一个产品。
具体工厂(ConcreteFactory):实现抽象工厂中的方法,生成具体的产品对象。
抽象产品(AbstractProduct):为每种产品声明接口。
具体产品(ConcreteProduct):实现抽象产品接口的具体类。
假设我们有两个产品族:ProductA 和 ProductB,每个产品族有两个版本。

// 抽象产品A
interface ProductA {void use();
}// 具体产品A1
class ConcreteProductA1 implements ProductA {public void use() {System.out.println("Using Product A1");}
}// 具体产品A2
class ConcreteProductA2 implements ProductA {public void use() {System.out.println("Using Product A2");}
}// 抽象产品B
interface ProductB {void eat();
}// 具体产品B1
class ConcreteProductB1 implements ProductB {public void eat() {System.out.println("Eating Product B1");}
}// 具体产品B2
class ConcreteProductB2 implements ProductB {public void eat() {System.out.println("Eating Product B2");}
}// 抽象工厂
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {public ProductA createProductA() {return new ConcreteProductA1();}public ProductB createProductB() {return new ConcreteProductB1();}
}// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {public ProductA createProductA() {return new ConcreteProductA2();}public ProductB createProductB() {return new ConcreteProductB2();}
}// 客户端代码
public class Client {public static void main(String[] args) {AbstractFactory factory1 = new ConcreteFactory1();ProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();productA1.use();productB1.eat();AbstractFactory factory2 = new ConcreteFactory2();ProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();productA2.use();productB2.eat();}
}

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

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

相关文章

pytest配置文件配置并通过allure生成报告

之前已经学习了使用pytestrequests实现各种方式的调用和一些脚本的执行,今天来学习下如何使用pytest.ini配置文件来管理用例的执行以及如何使用allure生成测试报告。 1.pytest.ini文件配置 在项目目录下新建pytest.ini文件,然后进行配置,pyt…

从路边摊到五星级酒店:六西格玛培训的价格与品质探秘!

当我们深入探讨市面上的六西格玛培训价格差异时,确实会发现不同机构之间存在着显著的差别。以张驰咨询和xx机构为例,两者在价格定位上形成了鲜明的对比,同时也展示了不同机构在教学理念和服务品质上的不同。 xx机构之所以能以亲民的价格吸引…

JVM常用概念之扁平化堆容器

扁平化堆容器是OpenJDK Valhalla 项目提出的,其主要目标为将值对象扁平化到其堆容器中,同时支持这些容器的所有指定行为,从而达到不影响原有功能的情况下,显著减少内存空间的占用(理想条件下可以减少24倍)。…

力扣416 分割等和子集 Java版本

文章目录 题目描述思路代码 题目描述 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以…

【技巧】Leetcode 191. 位1的个数【简单】

位1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。 示例 1: 输入:n 11 输出:3 解释&#x…

Vue前端环境搭建:从四个方面、五个方面、六个方面和七个方面深度解析

Vue前端环境搭建:从四个方面、五个方面、六个方面和七个方面深度解析 在构建Vue.js项目时,搭建一个稳定且高效的前端环境至关重要。这不仅关乎项目的顺利推进,更直接影响开发者的效率和代码质量。本文将从四个方面、五个方面、六个方面和七个…

C++ 36 之 this指针

#include <iostream> #include <string.h> using namespace std;// this指针 永远指向当前对象 class Students06{ public:int age;// int m_age; //member成员首字母mStudents06(int age){// 1.解决命名冲突的问题 this指针找成员变量需要使用->符号this->…

AI时代的产品经理的成长指南

前言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;我们正处在一个变革的时代。在这个时代&#xff0c;产品经理的角色和职责也在不断地发生变化和演进。为了在这个充满机遇和挑战的AI时代中脱颖而出&#xff0c;产品经理需要不断地学习、成长和适应。以…

vscode打包vue项目

1&#xff09;npm install 2&#xff09;npm install -g vue/cli 3&#xff09;npm run build 第三步注意&#xff1a;要查看根目录下 package.json 配置&#xff1b; 如果和我的一样 3&#xff09;应该为 npm run build:prod 4)将dist 文件考到nginx等web服务器即可使用…

功能测试 之 单模块测试----轮播图、登录、注册

单功能怎么测&#xff1f; 需求分析 拆解测试点 编写用例 1.轮播图 &#xff08;1&#xff09;需求分析 位置&#xff1a;后台--页面--广告管理---广告列表(搜索index页面增加广告位2) 操作完成后需要点击admin---更新缓存,前台页面刷新生效 &#xff08;2&#xff09;拆解…

算法02 递归算法及其相关问题

递归 在编程中&#xff0c;我们把函数直接或者间接调用自身的过程叫做递归。 递归处理问题的过程是&#xff1a;通常把一个大型的复杂问题&#xff0c;转变成一个与原问题类似的&#xff0c;规模更小的问题来进行求解。 递归的三大要素 函数的参数。在用递归解决问题时&…

Vue 3深度探索:自定义渲染器与服务端渲染

title: Vue 3深度探索&#xff1a;自定义渲染器与服务端渲染 date: 2024/6/14 updated: 2024/6/14 author: cmdragon excerpt: 这篇文章介绍了如何在Vue框架中实现自定义渲染器以增强组件功能&#xff0c;探讨了虚拟DOM的工作原理&#xff0c;以及如何通过SSR和服务端预取数…

爆肝三天,制作属于自己的地图——DAY3(地图数据发布详细教程)

4&#xff0c;重建顶层。 倾斜摄影数据的组织方式&#xff0c;一个 Data 目录下的 Tile 可能会成千上万&#xff0c;如果不使用重建顶层&#xff0c;那么输出的3DTiles的包围盒会非常非常多&#xff0c;增加加载时长。重建顶层&#xff0c;程序会根据瓦片的空间结构关系采用八…

高危CNVD获取姿势|用友-U8-OA基础版存在文件上传漏洞getshell

漏洞描述 用友U8-OA基础版存在任意文件覆盖写入漏洞 漏洞说明&#xff1a;用友U8-OA基础版因为代码问题&#xff0c;存在任意文件覆盖写入漏洞&#xff0c;可以覆盖写入系统中存在的文件&#xff0c;可getshell。FOFA指纹: body"致远" && "/yyoa/&quo…

MySQL----常见的存储引擎

存储引擎 存储引擎就是数据库如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的&#xff0c;所以存储引擎也可以称为表类型&#xff08;即存储和操作此表的类型&#xff09;。 MySQL存储引擎 M…

用 Azure OpenAI 服务开发生成式 AI

简介 在当今迅速发展的技术环境中&#xff0c;生成式人工智能&#xff08;AI&#xff09;成为了众多企业创新和优化业务流程的重要工具。微软的 Azure OpenAI 服务为开发生成式 AI 解决方案提供了强大的平台和工具。本文将介绍如何利用 Azure OpenAI 服务开发生成式 AI 解决方…

WinForm之TCP客户端通讯

目录 一 设计界面 二 后台代码 一 设计界面 二 后台代码 using System.Net.Sockets; using System.Text;namespace TCP网络客户端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpClient tcpClient new TcpClient();private void conne…

一文理清sshc包的使用场景和掌握两种连接方式及异常场景

一文理清sshc、ssh包的使用场景和两种连接方式 SSH协议SSH&#xff08;Secure Shell&#xff09;协议支持通过多种编程语言实现客户端和服务端的功能&#xff0c;包括Go、Python、Java、C#等。 GO语言 sshc包的使用建立连接1.DialWithKey2.DialWithPasswd 运行命令异常场景思维…

qt中的eventFilter函数

eventFilter函数是QObject类的一个事件过滤器&#xff0c;当使用installEventFilter方法为某个对象安装事件过滤器时&#xff0c;该函数就会被调用。在MainWindow类中重写eventFilter的目的通常是要拦截并处理特定对象的事件。 何时执行&#xff1a; 事件拦截&#xff1a;当任…

Non-aligned Supervision for Real Image Dehazing

原文链接&#xff1a;https://www.semanticscholar.org/paper/Non-aligned-supervision-for-Real-Image-Dehazing-Fan-Guo/7595d39e71ae58343e8728fc1af0e18ffe38218b 数据集&#xff1a;https://www.cityscapes-dataset.com/ 真实的图像去雾的非对准监督 摘要 由于天气条件…