软件设计模式------简单工厂模式

news2024/11/30 10:56:02

简单工厂模式(Simple factory Pattern),又称静态工厂方法(Static Factory Method),属于创新型模式,但它不属于GoF23个设计模式其一

一、模式动机:

有时需要创建一些来自相同父类的类的实例。

二、定义:

在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责其他类的实例,被创建的实例通常都具有共同的父类。

三、模式结构:

*1.Factory(工厂角色)

(1)工厂角色即工厂类,负责实现创建所有实例的内部逻辑;

(2)工厂类可以被外界直接调用,创建所需的产品对象;

(3)工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品的类,所有的具体产品都是抽象产品的子类。

2.Produce(抽象产品角色)

(1)抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例共有的公共接口;

(2)抽象产品的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法。因为所有的具体产品都是抽象产品的子类。

3.ConcreteProduce(具体产品角色)

(1)具体产品角色是简单工厂模式的创建目标;

(2)具体类中所创建的对象都充当对应具体类的实例;

(3)每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品角色里的抽象方法。

四、模式分析:

简单工厂模式的要点在于----当你需要什么,只需要传入一个正确的参数,就可以获得你所需要的对象,而无需知道其创建的细节。

五、模式实例与解析:

1.实例说明

        某电视机厂专为各种电视机品牌代工生产各类电视机,当需要海尔牌电视机时只需要在调用该工厂的工厂方法时传入参数Haier,需要海信电视机时只需要在调用该工厂的工厂方法时传入参数Hisense,工厂可以根据不同的参数返回不同品牌的电视机。

2.实例类图

3.实例代码
(1)TV接口
public interface TV {
    public void play();
}
(2)HaierTV类
public class HaierTV implements TV{
    public void play(){
        System.out.println("海尔电视机播放中......");
    }
}
(3)HisenseTV类
public class HisenseTV implements TV{
    public void play(){
        System.out.println("海信电视机播放中......");
    }
}
(4)TCLTV类
public class TCLTV implements TV{
    public void play(){
        System.out.println("TCL电视机播放中......");
    }
}
(5)TVFactory类
public class TVFactory {
    public static TV productTV(String brand){
        if(brand.equalsIgnoreCase("Haier")){
            System.out.println("电视机工厂生产海尔电视机。");
            return new HaierTV();
        }else if(brand.equalsIgnoreCase("Hisense")){
            System.out.println("电视机工厂生产海信电视机。");
            return new HisenseTV();
        }else if(brand.equalsIgnoreCase("TCL")) {
            System.out.println("电视机工厂生产TCL电视机。");
            return new TCLTV();
        }else {
            return (TV) new Exception("暂不生产该品牌电视机。");
        }
    }
}
4.辅助代码
(1)XMLUtil类
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class XMLUtil {
    public static String getBrandName(){
        try
        {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("configTV.xml"));

            //获取包含类名的文本节点
            NodeList nl = doc.getElementsByTagName("brandName");
            Node classNode=nl.item(0).getFirstChild();
            String brandName=classNode.getNodeValue();
            return brandName;
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
}
(2)配置文件configTV.xml

路径配置在工程下面

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <brandName>Haier</brandName>
</config>
(3)客户端测试类Client
public class Client {
    public static void main(String[] args) {
        try {
            TV tv;
            String brandName = XMLUtil.getBrandName();
            tv = TVFactory.productTV(brandName);
            tv.play();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
5.实例结果与分析

(1)如果在配置文件configTV.xml中将<brandName>中的内容为:Haier,则运行结果如下:

(2)如果将<brandName>中的内容改为:HisenseTV,则运行结果如下:

 TCL电视机同理.....

(3)分析:如果希望系统支持新的电视机产品,则需要新增加一个具体类,同时还要修改TVFactory中的工厂方法。

六、模式的优点:

1.可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任。

2.客户端无需知道所创建的具体类的类名,只需要知道具体产品类对应的参数即可,减少了使用者的记忆量。

3.通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增新新的具体产品类,在一定程度上提高了系统的灵活性。

七、模式的缺点

1.由于工厂类集中了所有产品创建逻辑,一旦不能工作,整个系统都将受到影响

2.由于新加一个产品就得新加一个产品具体类,所以在一定程度上增加了系统的复杂性和理解难度

3.系统扩展困难,一旦添加新产品就不得不修改共产逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

4.简单工厂模式由于使用了静态工厂方法造成工厂角色无法形成基于继承的等级结构。

八、模式适用环境:

(1)工厂类负责创建的对象较少

(2)客户端只知道传入工厂的参数,对于如何创建对象并不关心;客户端既不需要关心细节,甚至连类名也不需要记住,只需要记住类型所对应的参数即可。

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

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

相关文章

Java基于SpringBoot微信小程序的跳蚤市场系统设计与实现(lw+数据库+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

【数据分享】中国历史学年鉴(1979-2001)

数据介绍 目录如下&#xff1a; 特稿 2000年国际历史科学大会 史学研究 史学理论 西周春秋战国史 秦汉史 魏晋南北朝史 隋唐五代史 宋史 辽西夏金史 蒙元史 明史 清史 晚清政治史 近代文化史 中外关系史 近代经济史 近代社会史 近代思想史 民国政治史 世…

Navigation2 算法流程

转自 https://zhuanlan.zhihu.com/p/405670882 此文仅作学习笔记 启动流程 在仿真环境中启动导航包的示例程序&#xff0c;执行nav2_bringup/bringup/launch/tb3_simulation_launch.py文件。ROS2的launch文件支持采用python语言来编写以支持更加复杂的功能&#xff0c;本文件…

React高级Hook

useReducer useReducer 是 React 提供的一个 Hook&#xff0c;用于在函数组件中使用 reducer 函数来管理组件的 state。它类似于 Redux 中的 reducer&#xff0c;但仅用于组件内部的状态管理。useReducer 可以使复杂的状态逻辑更加清晰和可维护。 基本用法 useReducer 接收…

【SQL实验】数据库、表、模式的SQL语句操作

完整代码在文章末尾 1、数据库的建立、删除和修改操作 &#xff08;1&#xff09;使用SQL语句创建数据库EDUC&#xff0c;并进行如下设置&#xff1a; 数据库文件和日志文件的逻辑名称分别为&#xff1a;Student_data和Student_log&#xff1b;数据文件的物理文件名为‘C:\DA…

【Linux】:线程概念

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来线程概念相关代码和知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…

Oracle T5-2 ILOM配置

ILOM管理口ip地址配置 连接控制器&#xff08;SP&#xff09;串口&#xff08;RJ45)&#xff0c;进行系统设置 (缺省&#xff1a;9600&#xff0c;8-n-1&#xff0c;root/changeme) …………………. ORACLESP-AK02566506 login: root Password: Detecting screen size; pl…

CSS3 动画相关属性实例大全(1)(@keyframes ,background属性,border 属性)

CSS3 动画相关属性实例大全&#xff08;1) (CSS 中有动画效果的属性图例大全) 本文目录&#xff1a; 零、时光宝盒 一、CSS3 动画基本概念 &#xff08;1&#xff09;、CSS3的动画基本属性 &#xff08;2&#xff09;、keyframes 规则和所有动画属性 二、CSS 中有动画效果…

SQLI LABS | Less-1 GET - Error based - Single Quotes - String

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-1/ 靶场提示 …

CyberRT通信介绍与基于Reader、Writer的通信实践(apollo9.0)

目录 数据通信场景 CyberRT中的通信方式 ​编辑 通信模式 话题通信 服务通信 参数通信 protobuf protobuf简介 protobuf文件编写 topic通信实验 实验环境 实验准备 代码编写 定义消息格式 发送消息 接收消息 定义编译规则 程序编译 运行程序 数据通信场景 …

STM32-Modbus协议(一文通)

Modbus协议原理 RT-Thread官网开源modbus RT-Thread官方提供 FreeModbus开源。 野火有移植的例程。 QT经常用 libModbus库。 Modbus是什么&#xff1f; Modbus协议&#xff0c;从字面理解它包括Mod和Bus两部分&#xff0c;首先它是一种bus&#xff0c;即总线协议&#xff0c;和…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

使用HIP和OpenMP卸载的Jacobi求解器

Jacobi Solver with HIP and OpenMP offloading — ROCm Blogs (amd.com) 作者&#xff1a;Asitav Mishra, Rajat Arora, Justin Chang 发布日期&#xff1a;2023年9月15日 Jacobi方法作为求解偏微分方程&#xff08;PDE&#xff09;的基本迭代线性求解器在高性能计算&#xff…

Java实现油画滤镜效果【参数可调】

油画滤镜的基本原理 油画滤镜的基本思想是通过改变图像的像素&#xff0c;将每个像素用周围随机选择的像素来代替&#xff0c;从而产生类似油画笔触的效果。这种处理方式可以模糊图像的细节&#xff0c;使得图像的色块更加连贯&#xff0c;从而模仿油画的艺术效果。 核心步骤…

后台管理员登录实现--系统篇

我的小系统后台原来就有一个上传图片的功能还夹带个删除图片的功能&#xff0c;还嵌到了一个菜单里面。之前效果如下 那么现在为了加大安全力度&#xff0c;想增加一个登录页面。通过登录再到这个页面。看着貌似很简单&#xff0c;但是听我细细说来&#xff0c;要新增些什么东西…

OpenLayers:构建现代Web地图应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 OpenLayers&#xff1a;构建现代Web地图应用 文章目录 OpenLayers&#xff1a;构建现代Web地图应用1. 简介2. 为什么选择 OpenLa…

Redis 高可用:从主从到集群的全面解析

目录 一、主从复制 (基础)1. 同步复制a. 全量数据同步b. 增量数据同步c. 可能带来的数据不一致 2. 环形缓冲区a. 动态调整槽位 3. runid4. 主从复制解决单点故障a. 单点故障b. 可用性问题 5. 注意事项a. Replica 主动向 Master 建立连接b. Replica 主动向 Master 拉取数据 二、…

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面&#xff0c;找到java项目&#xff0c;点击状态暂停服务 2.打开“文件”页面&#xff0c;进入jar包目录&#xff0c;删除原有的jar包&#xff0c;上传新jar包 3. 再回到第一步中的网站页面&#xff0c;找到jar项目&#xff0c;启动项目即可 前端发…

C#的小数位保留以及四舍五入

C#使用Math.Round("数值","保留位","保留方式")进行小数位保留以及四舍五入 //1.MidpointRounding.ToEven(四舍六入五成双) //当保留小数位后一位为0~4时&#xff0c;舍去末位 var x1 Math.Round(1.124, 2, MidpointRo…

立仪科技:光谱共焦传感器精准测量玻璃

光谱共焦测量技术作为一种创新的光学检测方法&#xff0c;近年来在工业领域引起了广泛关注。 它以其高精度、非接触式的特点&#xff0c;特别适用于透明或半透明材料如玻璃的厚度和表面形貌测量。 接下来&#xff0c;立仪科技小编将深入探讨光谱共焦技术在玻璃测量上的应用及其…