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

简单工厂模式(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)客户端只知道传入工厂的参数,对于如何创建对象并不关心;客户端既不需要关心细节,甚至连类名也不需要记住,只需要记住类型所对应的参数即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(二十)、从宿主机访问 k8s(minikube) 发布的 redis 服务

文章目录 1、环境准备2、具体操作2.1、启动 minikube (start/stop)2.2、准备 redis-deployment.yaml2.3、执行 redis-deployment.yaml2.3.1、查看 pod 信息和日志 2.4、检查部署和服务状态2.4.1、如果需要删除 3、查看 IP 的几个命令3.1、查看IP的几个命令3.2、解读3.3、宿主机…

【C语言】数据输出格式控制

数据的输出格式修饰 常用两种&#xff1a; 整型中&#xff0c;输出数据左对齐、右对齐、占m位、不足m位前补0。浮点型中&#xff0c;默认通过四舍五入保留小数点后6位&#xff0c;通过参数设置保留小数点后n位。 #include <stdio.h> #define PI 3.14159 /* 功能&#x…

D43【python 接口自动化学习】- python基础之函数

day43 装饰器&#xff08;上&#xff09; 学习日期&#xff1a;20241020 学习目标&#xff1a;函数&#xfe63;- 56 装饰器&#xff1a;函数嵌套的定义与调用的区别 学习笔记&#xff1a; 变量作用域 变量读取顺序&#xff1a;local-》enclosed-》global-》builtin # 变量…

Spring MessageSource国际化原理

spring framework提供MessasgeSource来实现国际化。 MessageSource用法 准备properties文件&#xff0c;放在resources文件夹下面。这是默认语言和韩语的文件。 i18n/message.propertiesi18n/message_ko.properties 文件里面的内容是key-value格式,使用{0}、{1}作为变量占位…

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

Win10 IDEA远程连接HBase

Win10 IDEA远程连接HBase Win10 IDEA连接虚拟机中的Hadoop&#xff08;HDFS&#xff09; 关闭Hadoop和Hbase 如果已经关闭不需要走这一步 cd /usr/local/hbase bin/stop-hbase.sh cd /usr/local/hadoop ./sbin/stop-dfs.sh获取虚拟机的ip 虚拟机终端输入 ip a关闭虚拟机…

VS Code开发qt项目

没整明白&#xff0c;尴尬 安装扩展 设置cmake路径 前提是已经安装了QT 报错 用msvc选windows启动&#xff0c;用mingw则选gdb启动

Vue3 新特性、Pinia

一、新特性 - defineOptions 背景说明 因为我们用了<script setup>语法&#xff0c;没办法给setup去提供一些平级的属性&#xff0c;官方就提供了一个叫做 defineOptions 的语法 所以在 Vue3.3 中引入了 defineOptions 宏&#xff0c;用来定义 Options API 的选项。可以…

[OpenCV] 数字图像处理 C++ 学习——17模板匹配详细讲解+附完整代码

文章目录 前言1.理论基础1.1模板匹配介绍1.2匹配算法介绍 2.代码实现2.1模块匹配(matchTemplate)2.2最佳匹配函数(minMaxLoc()) 3.完整代码 前言 模板匹配是图像处理和计算机视觉领域中的一种经典技术&#xff0c;它通过在大图像中搜索与小图像&#xff08;模板&#xff09;匹…

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

Tkinter 的布局pack() and grid()笔记

#encodingutf-8 import tkinter import re import tkinter.messagebox import tkinter.simpledialog import sys import os def get_resources_path(relative_path):if getattr(sys,frozen, False):base_pathsys._MEIPASS#获取临时文件else:base_pathos.path.dirname(".&q…

鸿蒙应用开发----西西购物商城(一)

目录 前言 一、项目介绍 二、项目结构 三、开发工具 四、样式展示 前言 harmonyos是华为推出的一款新一代操作系统&#xff0c;致力于打破设备间的边界&#xff0c;构建统一的智能生态。西西购物商城作为一款基于harmonyos开发的应用&#xff0c;能够利用鸿蒙的分布式技术…

R语言绘制Venn图(文氏图、温氏图、维恩图、范氏图、韦恩图)

Venn图&#xff0c;又称文氏图&#xff0c;标题中其他名字也是它的别称&#xff0c;由封闭圆形组成&#xff0c;代表不同集合。圆形重叠部分表示集合交集&#xff0c;非重叠处为独有元素。在生物学、统计学等领域广泛应用&#xff0c;可展示不同数据集相似性与差异&#xff0c;…

大数据新视界 --大数据大厂之大数据在智慧城市建设中的应用:打造智能生活的基石

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…

集合collection和泛型

collection可以直接打印内容&#xff0c;而不是地址&#xff0c;内部已经重写了。 List家族&#xff1a; package com.itheima.d6_collection_update_delete;import java.util.ArrayList; import java.util.Iterator; import java.util.List;/**目标&#xff1a;研究集合遍历并…

Fooocus模型部署指南

一、介绍 Fooocus是一款开源的AI绘画工具&#xff0c;由斯坦福大学博士生张吕敏&#xff08;Github上用户名lllyasviel&#xff09;开发。是一款结合StableDiffusion和Midjourney理念的图像生成工具&#xff0c;提供离线、开源且易于使用的界面。它简化安装步骤&#xff0c;用…

【软件测试】JUnit

Junit 是一个用于 Java 编程语言的单元测试框架&#xff0c;Selenium是自动化测试框架&#xff0c;专门用于Web测试 本篇博客介绍 Junit5 文章目录 Junit 使用语法注解参数执行顺序断言测试套件 Junit 使用 本篇博客使用 Idea集成开发环境 首先&#xff0c;创建新项目&#…

【深度学习】评价指标

https://zhuanlan.zhihu.com/p/479060683 https://blog.csdn.net/fyfugoyfa/article/details/136414958 Confusion Matrix&#xff0c;是一个用来衡量模型好坏的统计量&#xff0c;其中Accuracy&#xff0c;Precision&#xff0c;F1 score&#xff0c;Recall&#xff0c;ROC曲线…

[SAP ABAP] SE11定义数据类型(结构与表类型)

1.定义结构 使用事务码SE11创建数据类型(结构)&#xff0c;输入自定义的数据类型名称&#xff0c;点击创建按钮 勾选结构并点击确定按钮 填写简短描述&#xff0c;并在"组件"页签上添加相关字段信息&#xff0c;点击激活按钮即可生效该结构ZSPO_HEADER_437 2.定义表…