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

embedded/2024/10/21 5:29:05/

简单工厂模式(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接口
java">public interface TV {public void play();
}
(2)HaierTV类
java">public class HaierTV implements TV{public void play(){System.out.println("海尔电视机播放中......");}
}
(3)HisenseTV类
java">public class HisenseTV implements TV{public void play(){System.out.println("海信电视机播放中......");}
}
(4)TCLTV类
java">public class TCLTV implements TV{public void play(){System.out.println("TCL电视机播放中......");}
}
(5)TVFactory类
java">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类
java">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

路径配置在工程下面

java"><?xml version="1.0" encoding="UTF-8" ?>
<config><brandName>Haier</brandName>
</config>
(3)客户端测试类Client
java">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.ppmy.cn/embedded/129187.html

相关文章

iPhone照片内存怎么清理,参考这些方法

随着拍摄数量的增加&#xff0c;许多iPhone用户常常发现自己的手机存储空间不足&#xff0c;而照片无疑是占用空间的罪魁祸首之一。清理这些照片不仅能释放存储空间&#xff0c;还能提升设备的运行速度。小编将分享一些iPhone照片内存怎么清理的高效策略&#xff0c;助你告别冗…

AsyncTask的工作原理和缺陷

AsyncTask的工作原理及其缺陷 AsyncTask是Android平台提供的一个轻量级的异步任务类&#xff0c;它允许开发者在后台线程中执行耗时操作&#xff0c;并在操作完成后将结果回调到主线程以更新UI。AsyncTask内部封装了线程池和Handler机制&#xff0c;简化了多线程编程的复杂性。…

深入理解Android WebView的加载流程与事件回调

文章目录 一、WebView 加载流程时序图二、WebView 加载流程回调函数说明三、AwContents3.1 主要功能和职责3.2 架构和实现3.3 使用场景 四、利用WebView回调函数检测白屏4.1 使用onPageStarted和onPageFinished检测加载时间4.2 利用onReceivedError和onReceivedHttpError检测加…

微信小程序-WXS

文章目录 微信小程序-WXS概述语法文档内联WXS脚本外联WXS脚本 微信小程序-WXS 概述 WXS&#xff08;WeiXin Script&#xff09;是小程序的一套脚本语言&#xff0c;可以结合 WXML 构建出页面结构。 WXS 的应用场景是“过滤器”&#xff0c;所谓的过滤器是指在渲染数据之前&a…

如何使用Websocket订阅实时股票价格

WebSocket和HTTP请求在工作原理和使用场景上存在显著区别。首先&#xff0c;HTTP是一种无状态的协议&#xff0c;客户端发起请求&#xff0c;服务器响应后&#xff0c;连接通常会关闭。如果客户端需要再次获取数据&#xff0c;必须发起新的请求。这种"请求-响应"模型…

简单实现通过电脑操作手机

通过电脑操作手机&#xff0c;支持单击&#xff0c;拖抓事件&#xff0c;延时有1-2秒。 具体步骤&#xff1a; 1、从手机截图到sdcard 2、将图片导出到PC 3、从PC加载展示图片 4、开启定时器 5、设置点击、滚动事件 1、 private static void takeScreenshot(String path)…

Kafka异常重试方案小记

背景 在最近进行的项目架构升级中&#xff0c;我们对原有的核心项目结构进行了细致的拆分。 现在&#xff0c;核心项目与非核心项目之间的通信和数据交换主要通过Kafka这一中间件来实现。 这种设计主要体现在核心项目向非核心项目发送通知&#xff0c;这些通知大致可以分为三个…

【Linux】并行与并发(含时间片)

简单来说 并发&#xff1a;多个进程轮流使用同一个CPU&#xff0c;在逻辑层面上&#xff0c;一段时间内推进完成了多个进程 并行&#xff1a;机器中有多个CPU可以使用&#xff0c;在物理层面上&#xff0c;做到同一时间会有多个进程同时在运行 举个例子&#xff1a;一群人需要…