软件设计模式------工厂方法模式

工厂方法模式(Factory Method Pattern),又称工厂模式,也叫虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Pactory Pattern),属于类创建型模式。

        我们知道简单工厂模式最大的缺点就是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”。

        并且在简单工厂模式中,所有的产品都是由同一个工厂创建,则造成了工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性。

一、模式动机:

        考虑到这样一个系统,一个具体工厂只生产一种具体产品。

        例如,简单工厂模式下,按钮工厂既生产圆形按钮也生产矩形按钮或其他按钮等等

        但在工厂方法模式下,我们先定义一个抽象的按钮工厂类(接口),再定义具体的工厂类来生产具体的按钮(产品),即圆形工厂只生产圆形按钮,矩形工厂只生产矩形按钮,圆形工厂和矩形工厂都实现抽象的按钮工厂接口。

***这样进行抽象化的结果使工厂模式这种结构可以在不修改具体工厂类的情况下引进新的产品

即:如果出现新的按钮类型,只需为这种新的按钮类型新建一个具体共厂类,即可获得该新按钮的实例。

二、定义:

        在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,则工厂子类负责生成具体的产品对象,即通过工厂子类来确定究竟应该实例化哪一个具体产品类

三、模式结构:

1.Product(抽象产品):

        定义产品的接口。

2.ConcreteProduct(具体产品):

        实现抽象产品接口。

3.Factory(抽象工厂):

        声明工厂方法,用于返回一个产品。

4.ConcreteFactory(具体工厂):

        实现抽象工厂的工厂方法,并可由客户调用,返回一个具体产品类的实例。

四、模式分析:

        具体工厂类都具有共同的接口,或者有共同的抽象父类。当系统扩展需要添加新的产品时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也无需修改客户端,很好地符合了“开闭原则”。

五、模式实例与解析:

1.实例说明

        在某网络管理软件中,需要为不同的网络协议提供不同的连接类,例如针对POP3协议的连接类POP3Connection,针对IMAP协议的连接类IMAPConnection,针对HTTP协议的连接类HTTPConnection,由于网络连接对象的创建过程较为复杂,需要将其创建过程封装到专门的类中,该软件还将支持更多类型的网络协议。现采用工厂方法模式进行设计,绘制类图并编程模拟实验。

2.实例类图

3.实例代码

(产品区 Products包)

(1)Connection接口

package Products;public interface Connection {public void connect();
}

(2)HTTPConnection类

package Products;public class HTTPConnection implements Connection{@Overridepublic void connect() {System.out.println("Connecting HTTP ...");}
}

(3)IMAPConnection类

package Products;public class IMAPConnection implements Connection{@Overridepublic void connect() {System.out.println("Connecting IMAP ...");}
}

(4)POP3Connection类

package Products;public class POP3Connection implements Connection{@Overridepublic void connect() {System.out.println("Connecting POP3 ...");}
}

(工厂区 Factories包)

(1)ConnectionFactory接口

package Factories;import Products.Connection;public interface ConnectionFactory {public Connection create();
}

(2)HTTPFactory类

package Factories;import Products.Connection;
import Products.HTTPConnection;public class HTTPFactory implements ConnectionFactory{@Overridepublic Connection create() {return new HTTPConnection();}
}

(3)IMAPFactory类

package Factories;import Products.Connection;
import Products.IMAPConnection;public class IMAPFactory implements ConnectionFactory{@Overridepublic Connection create() {return new IMAPConnection();}
}

(4)POP3Factory类

package Factories;import Products.Connection;
import Products.POP3Connection;public class POP3Factory implements ConnectionFactory{@Overridepublic Connection create() {return new POP3Connection();}
}
4.辅助代码

(1)XMLUtil类

(Clients包下)

package Clients;import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class XMLUtil
{//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;doc = builder.parse(new File("FactoryMethodconfig.xml"));//获取包含类名的文本节点NodeList nl = doc.getElementsByTagName("className");Node classNode=nl.item(0).getFirstChild();String cName=classNode.getNodeValue();//通过类名生成实例对象并将其返回Class c=Class.forName(cName);Object obj=c.newInstance();return obj;}catch(Exception e){e.printStackTrace();return null;}}
}

(2)客户端测试类 Client类

(在Clients包下)

package Clients;import Factories.ConnectionFactory;
import Factories.HTTPFactory;
import Products.Connection;public class Client {public static void main(String[] args) {ConnectionFactory factory;Connection connection;factory = (ConnectionFactory) XMLUtil.getBean();connection = factory.create();connection.connect();}
}

(3)配置文件FactoryMethodconfig.xml

(路径放在工程下面)

<?xml version="1.0"?>
<config><className>Factories.HTTPFactory</className>
</config>
5.实例结果与分析

(1)如果将配置文件FactoryMethodconfig.xml中的<className>里的内容改为Factories.IMAPFactory(包名.具体工厂类),则运行结果如下:

(2)如果将配置文件FactoryMethodconfig.xml中的<className>里的内容改为Factories.POP3Factory,则运行结果如下:

(3)分析:在系统中加入一个新产品时,只需添加一个具体工厂类和一具体产品类即可。

六、模式的优点

        1、在工厂方法模式中,工厂方法用来用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关系具体产品所对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名。

        2、所有的工厂具体类都具有同一抽象工厂父类。

        3、在系统中加入一个新产品时,只需添加一个具体工厂类和一具体产品类即可。而无需修改抽象工厂类和抽象产品类的接口。如此便完全符合了”开闭原则“。

七、模式的缺点

        1、在系统中加入一个新产品时,只需添加一个具体工厂类和一具体产品类即可,但随着新产品数量的增加,类的数量也随着增加,则在一定程度增加了系统的复杂度,另外更多的类需要编译和运行,会给系统带来一些额外的开销。

        2、由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用了抽象层进行了定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

八、模式适用环境

        (1)一个类(客户端,即测试类)不知道它所需要的对象的类(具体产品类类名),只需知道对应的具体工厂类类名即可。

        (2)将创建对象的任务委托给多个工厂子类的某一个,客户端在使用时无需关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体产品类的类名存储在配置文件或数据库中。

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

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

相关文章

WIFI实现透传+接线图

单片机通过TX接WIFI模块的RX将设置的AT代码写入WIFI模块&#xff08;连接WIFI调为设备模式&#xff08;有设备&#xff0c;路由&#xff0c;双模等模式&#xff09;&#xff09; WIFI模块将响应信号通过TX通过CH340发给PC的RX 通过STC-ISP或安信可串口调试助手查看响应信息 …

Golang | Leetcode Golang题解之第495题提莫攻击

题目&#xff1a; 题解&#xff1a; func findPoisonedDuration(timeSeries []int, duration int) (ans int) {expired : 0for _, t : range timeSeries {if t > expired {ans duration} else {ans t duration - expired}expired t duration}return }

qt QGraphicsEffect详解

一、QGraphicsEffect概述 QGraphicsEffect通过挂接到渲染管道并在源&#xff08;例如QGraphicsPixmapItem、QWidget&#xff09;和目标设备&#xff08;例如QGraphicsView的视口&#xff09;之间进行操作来更改元素的外观。它允许开发者为图形项添加各种视觉效果&#xff0c;如…

Java网络编程-简单的API调用

Get请求 - 无参数 安装依赖库 首先需要安装一个库&#xff1a; Okhttp3&#xff0c;这是一个非常流行的 HTTP 库&#xff0c;可以简单、快速的实现 HTTP 调用。 安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖&#xff1a; <!-- https://mvnrepository.com/artifact/co…

【算法】哈希表:49.字母异位词分组

目录 1、题目链接 2、题目介绍 3、解法 初始化设定--图解 步骤图解 4、代码 1、题目链接 49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 字母异位词的本质是字符相同但排列不同。因此&#xff0c;我们可以对字符串进行排序&#xf…

YOLOv8实战水果识别【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对水果数据集进行训练和优化&#xff0c;该数据集包含丰富的水果图像样本&#xf…

零基础Java第七期:方法的使用

一、方法的概念与使用 1.1. 方法的概念 方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义&#xff1a; 是能够模块化的组织代码(当代码规模比较复杂的时候)做到代码被重复使用, 一份代码可以在多个位置使用让代码更好理解更简单直接调用现有方法开…

Solidity基础语法

Solidity的在线编辑器&#xff1a;https://remix.ethereum.org/ 一、合约结构 1、SPDX许可标识&#xff1a;指定代码的开源许可 2、pragma指令&#xff1a;声明Solidity版本 3、导入语句&#xff1a;引入其他合约或库 4、合约声明&#xff1a;使用contract关键字 5、状态变量&…

直流和交流变频压缩机工作原理

直流变频压缩机工作原理&#xff1a; 压缩机定子产生旋转磁场与转子永磁磁场直接作用&#xff0c;实现压缩机运转。转子是永磁体&#xff0c;没有线圈/绕组&#xff0c;无需外部供电&#xff0c;不产生电能损耗&#xff0c;效率高、节能&#xff1b;直流变频压缩机属于同步控制…

uboot中mmc是使用

进入uboot的界面后 mmc命令 mmc list #查看有哪些可用的mmc设备 mmc dev 0 #切换到mmc的0设备&#xff0c;一般是指SD卡 ls mmc 0:1 #查看mmc 0设备&#xff08;sd卡&#xff09;中1分区保存的信息 ls mmc 0:2 #查看mmc 0设备&#xff08;sd卡&#xff09;中2分区保存的信…

Leetcode 1129. 颜色交替的最短路径

1.题目基本信息 1.1.题目描述 给定一个整数 n&#xff0c;即有向图中的节点数&#xff0c;其中节点标记为 0 到 n – 1。图中的每条边为红色或者蓝色&#xff0c;并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges&#xff0c;其中&#xff1a; redEdges[i] …

顺序表算法题【不一样的解法!】

本章概述 算法题1算法题2算法题3彩蛋时刻&#xff01;&#xff01;&#xff01; 算法题1 力扣&#xff1a;移除元素 我们先来看这个题目的要求描述&#xff1a; 把与val相同数值的元素移除掉&#xff0c;忽略元素的相对位置变化&#xff0c;然后返回剩下与val值不同的元素个数…

基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

pytest中@pytest.fixture常用顺序function

ytest中pytest.fixture用法讲解 1、测试函数开始之前2、执行测试函数&#xff1a;3、测试函数结束后&#xff1a; 备注&#xff1a;内容来自chatGPT 在 pytest 中&#xff0c;pytest.fixture 是一个非常强大的功能&#xff0c;用于设置测试所需的环境和状态。它可以通过 scope…

AP上线的那些事儿(1)capwap建立过程、设备初始化以及二层上线

1、了解FITAP与AC的建立过程 之前我们已经知道了FATAP与FIT是一对双胞胎一样的兄弟&#xff0c;FAT哥哥能够直接独立使用当AP桥接、路由器等&#xff0c;而弟弟FIT则比较薄弱&#xff0c;独自发挥不出功效&#xff0c;需要一位师傅&#xff08;AC&#xff09;来带领&#xff0c…

ssm配置模式

新版 用Java类&#xff0c;全注解demo案例 1. AppConfig.java (Spring主配置类)package com.example.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.cont…

MATLAB实现AM调制解调

1.基本概念 1.1 AM调制原理 调幅就是使载波的振幅随调制信号的变化规律而变化。基带信号m(t)与直流分量A0相加&#xff0c;然后和高频载波相乘实现AM信号的调制&#xff0c;如图1所示。 1.2 AM解调原理 AM信号经过信道传输&#xff0c;引入噪声后&#xff0c;再和载波相乘&…

OpenCV之换脸技术:一场面部识别的奇妙之旅

在这个数字化与智能化并进的时代&#xff0c;图像处理技术日益成为连接现实与虚拟世界的桥梁。其中&#xff0c;换脸技术作为一项颇受欢迎且富有挑战性的应用&#xff0c;不仅让人惊叹于技术的魔力&#xff0c;更在娱乐、影视制作等领域展现了无限可能。今天&#xff0c;我们就…

arp欺骗及其实验

ARP欺骗&#xff08;ARP Spoofing&#xff09;是一种网络攻击技术&#xff0c;攻击者通过伪造ARP&#xff08;地址解析协议&#xff09;消息&#xff0c;将其MAC地址与目标IP地址关联&#xff0c;从而实现对网络流量的截获、篡改或重定向。以下是ARP欺骗的详细信息&#xff1a;…

怎么修改编辑PDF的内容,有这4个工具就行了。

PDF 软件在现代的办公或者是学习当中的应用非常广泛&#xff0c;编辑PDF内容对很多人来说也是一件常有的事情。如果有了PDF 编辑软件&#xff0c;查看&#xff0c;编辑&#xff0c;修改&#xff0c;分享也会变得更加方便简单&#xff0c;所以今天要给大家介绍几款这样的工具。 …