设计模式总结-工厂方法模式

工厂方法模式

    • 简单工厂模式的不足
    • 模式动机
    • 模式定义
    • 模式结构
    • 模式分析
    • 模式实例与解析

简单工厂模式的不足

在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”。在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。

模式动机

考虑这样一个系统,按钮工厂类可以返回一个具体的按钮实例,如圆形按钮、矩形按钮、菱形按钮等。在这个系统中,如果需要增加一种新类型的按钮,如椭圆形按钮,那么除了增加一个新的具体产品类之外,还需要修改工厂类的代码,这就使得整个设计在一定程度上违反了“开闭原则”。
在这里插入图片描述

现在对该系统进行修改,不再设计一个按钮工厂类来统一负责所有产品的创建,而是将具体按钮的创建过程交给专门的工厂子类去完成,我们先定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮、矩形按钮、菱形按钮等,它们实现在抽象按钮工厂类中定义的方法。这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的按钮类型,只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合“开闭原则”。
在这里插入图片描述

模式定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

模式结构

在这里插入图片描述

工厂方法模式包含如下角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

模式分析

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则”。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。

模式实例与解析

实例一:电视机工厂
将原有的工厂进行分割,为每种品牌的电视机提供一个子工厂,海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海信电视机,如果需要生产TCL电视机或创维电视机,只需要对应增加一个新的TCL工厂或创维工厂即可,原有的工厂无须做任何修改,使得整个系统具有更加的灵活性和可扩展性。

在这里插入图片描述

<?xml version="1.0"?>
<config><className>HaierTVFactory</className>
</config>
public interface TV
{public void play();
}public class HaierTV implements TV
{public void play(){System.out.println("HaierTV......");}
}
public class HisenseTV implements TV
{public void play(){System.out.println("HisenseTV......");}	
}public interface TVFactory
{public TV produceTV();
}public class HaierTVFactory implements TVFactory
{public TV produceTV(){System.out.println("HaierTVFactory。。。");return new HaierTV();}
}public class HisenseTVFactory implements TVFactory
{public TV produceTV(){System.out.println("HisenseTVFactory。。。");return new HisenseTV();}
}public class Client
{public static void main(String args[]){try{TV tv;TVFactory factory;factory=(TVFactory)XMLUtil.getBean();tv=factory.produceTV();tv.play();}catch(Exception e){System.out.println(e.getMessage());}}
}
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{public static Object getBean(){try{//�����ĵ�����DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;							doc = builder.parse(new File("config.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;}}
}

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

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

相关文章

Windows集群部署项目

目录 一&#xff0c;环境准备 1.1.安装MySQL 1.2.安装JDK 1.3.安装TomCat 1.4.安装Nginx 二&#xff0c;部署 2.1.后台服务部署 2.2.Nginx配置负载均衡及静态资源部署 一&#xff0c;环境准备 1.1.安装MySQL 可以参考博客&#xff1a;http://t.csdnimg.cn/A75bg 1.2.…

RP2040开发笔记

RP2040 采用合宙的RP2040(板载4MB Flash)&#xff0c; 所有开发资料参考官方&#xff1a;树莓派 Pico 中文站

2024整理一些前端面试题库一

以下是一些2024年前端面试题及其答案&#xff1a; HTML、XML、XHTML之间的区别是什么&#xff1f; HTML是一种标记语言&#xff0c;用于创建网页&#xff0c;定义页面的结构和内容&#xff0c;如标题、段落、表格、链接、图片等。 XML&#xff08;可扩展标记语言&#xff09;…

【活动创作】未来AI技术方面会有哪些创业机会

放假期间突然看到这个活动创作&#xff0c;觉得很有意思&#xff0c;既然如此&#xff0c;我就先让AI来回答一下吧&#xff0c;哈哈 1、文心一言 首先来看看文心一言的回答&#xff1a; 2、讯飞星火 然后来看看讯飞星火的回答&#xff1a; 3、个人感受 最后来说说给人感受吧&am…

查看MySQL版本的方式

文章目录 一、使用cmd输入命令行查看二、在mysql客户端服务器里查询 一、使用cmd输入命令行查看 1、打开 cmd &#xff0c;输入命令行&#xff1a; mysql --version 2、还是打开cmd&#xff0c;输入命令行&#xff1a;mysql -V (注意了&#xff0c;此时的V是个大写的V) 二、…

Linux课程____LVM(逻辑卷管理器)

LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层&#xff0c;它提供了一个抽象的卷组&#xff0c;可以把多块硬盘进行卷组合并。 这样一来&#xff0c;用户不必关心物理硬盘设备的底层架构和布局&#xff0c;就可以实现对硬盘分区的动态调整。 动态调整磁盘容量&#xff…

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美(含源码仅此一份,先到先得)

【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09; 目录 【GO语言卵细胞级别教程】11.探索Go语言的面向对象编程之美&#xff08;含源码仅此一份&#xff0c;先到先得&#xff09;1.面向对象的引用1.1简介1…

linux 搭建Samba服务

Samba简介 SAMBA是⼀个实现不同操作系统之间⽂件共享和打印机共享的⼀种SMB协议的免费软件&#xff0c; SMB(Server Message block)协议是window下所使⽤的⽂件共享协议&#xff0c;我们在linux系统或 者其类unix系统当中可以通过samba服务来实现SMB功能。 &#xff08;1&…

B/S架构SaaS模式 医院云HIS系统源码,自主研发,支持电子病历4级

B/S架构SaaS模式 医院云HIS系统源码&#xff0c;自主研发&#xff0c;支持电子病历4级 系统概述&#xff1a; 一款满足基层医院各类业务需要的云HIS系统。该系统能帮助基层医院完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查…

【并发编程】线程安全

线程安全 1. 讲一下 synchronized 关键字的底层原理 1.1 基本使用 如下抢票的代码&#xff0c;如果不加锁&#xff0c;就会出现超卖或者一张票卖给多个人 synchronized&#xff0c;同步【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】 其它线程再想获…

【QT+QGIS跨平台编译】056:【pdal-dimbuilder+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal介绍二、dimbuilder介绍三、pdal下载四、文件分析五、pro文件六、编译实践七、生成Dimension.hpp八、生成pdal_features.hpp一、pdal介绍 PDAL(Point Data Abstraction Library)是一个开源库,用于处理点云数据的获取、过滤、转换、分析和…

基于微信小程序的实验室预约系统的设计与开发

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

[C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体

关于C版本帧差法可以参考博客 [C]OpenCV基于帧差法的运动检测-CSDN博客https://blog.csdn.net/FL1768317420/article/details/137397811?spm1001.2014.3001.5501 我们将参考C版本转成opencvsharp版本。 帧差法&#xff0c;也叫做帧间差分法&#xff0c;这里引用百度百科上的…

模糊控制对应关系

一. 基本的一些对应关系 1.论域&#xff1a;X&#xff0c;一般来说取得变量∀x∈X 2.隶属函数&#xff1a;μ( x ) 3.误差&#xff1a;e 4.误差变化率&#xff1a;c&#xff0c;这是对误差求导得到的 5.模糊集常用的量&#xff1a; PL/PB&#xff08;Positive Large/Posi…

猫头虎分享已解决Bug: ERROR: Could not find a version that satisfies the requirement

猫头虎分享已解决Bug: ERROR: Could not find a version that satisfies the requirement &#x1f42f;&#x1f4bb; 摘要 &#x1f4c4; 大家好&#xff0c;我是猫头虎博主&#xff0c;今天我们要聊聊后端技术领域中的一个常见Bug&#xff1a;ERROR: Could not find a vers…

关联规则(理论及实例)

目录 一、啤酒和尿布的故事 二、理论 三、实例 1. 自定义数据集 2. 数据需转换成one-hot编码 3.电影题材关联分析 一、啤酒和尿布的故事 在美国&#xff0c;一些年轻的父亲下班后经常要到超市去购买婴儿尿布&#xff0c;超市因此发现一个规律&#xff0c;在购买婴儿尿布的…

剑指Offer题目笔记25(使用回溯法解决其他类型问题)

面试题85&#xff1a; 问题&#xff1a; ​ 输入一个正整数n&#xff0c;输出所有包含n个左括号和n个右括号的组合&#xff0c;要求每个组合的左括号和右括号匹配。 解决方案&#xff1a; ​ 使用回溯法。因为要生成n个左括号和n个右括号&#xff0c;故需要走2n步&#xff0…

SD-WAN国际网络专线:高效、合规且可靠的跨境连接解决方案

在数字化时代&#xff0c;企业对跨境网络连接的需求日益增长。SD-WAN技术作为一种新兴的解决方案&#xff0c;正逐渐成为构建跨境网络连接的首选。本文将探讨SD-WAN国际网络专线的发展现状、合规性要求以及选择时需要考虑的关键因素。 SD-WAN技术&#xff1a;跨境网络连接的新…

【C++】排序算法 --快速排序与归并排序

目录 颜色分类&#xff08;数组分三块思想&#xff09;快速排序归并排序 颜色分类&#xff08;数组分三块思想&#xff09; 给定⼀个包含红⾊、⽩⾊和蓝⾊、共 n 个元素的数组 nums &#xff0c;原地对它们进⾏排序&#xff0c;使得相同颜⾊ 的元素相邻&#xff0c;并按照红⾊、…

12-项目部署_持续集成

项目部署_持续集成 1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从…