linux车机系统怎么进工厂模式,工厂方法模式 - 跟JBPM学习设计模式_Linux编程_Linux公社-Linux系统门户网站...

news/2024/5/20 13:20:32/文章来源:https://blog.csdn.net/weixin_32667439/article/details/116864375

模式简介

工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化那个类,其使一个类的实例化延迟到其子类中。

前边我们学习了简单工厂模式,简单工厂模式的最大优势在于工厂类中包含了必要逻辑判断,根据客户端的条件动态实例化相关的类,对于客户端不需要了解具体的产品类,所以解除了对具体产品类的依赖。在引入新的产品的时候,我们不需要修改客户端代码,但是必须修改工厂,所以违背了开闭原则。

工厂方法模式是简单工厂模式的进一步抽象和推广。由于工厂类使用多态性,使其即保持了简单工厂模式的优点,也克服了其缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做,它仅仅负责给出具体工厂类需要实现的接口。通过这种抽象和依赖倒转的结果,这样就可以允许我们在不修改具体工厂类的前提下,引进新的产品类型。

工厂方法模式的结构如下图,其一般会涉及到一下角色

b543c9ebb0531c50bcd8c85c11d804fd.png

图 1. 工厂方法模式结构图

抽象工厂:为具体的工厂类提供必需实现的接口,其通常是与具体的业务应用无关。

具体工厂:其实现抽象工厂定义的接口,其接受客户的调用创建产品对象。

抽象产品:工厂方法模式创建的产品对象的父类,其提供具体产品需要继承的成员。

具体产品:工厂类需要创建的产品对象。

JBPM中的工厂方法模式

日志功能往往是每个软件系统必备的模块,JBPM也不例外,其本身支持两种日志类型,我们可以通过配置灵活的选择。其中对Log对象的实例化使用了工厂方法模式,具体的结构图如下

43b00e79957d308910716eb39ab9e282.png

图 1. JBPM中的工厂方法模式结构图

Log类作为产品基类,其提供了具体的产品需要实现的所有的接口,在这里就是获取日志等级开关和相应等级记录日志的接口;但是在这里其提供了一个静态的getLog方法,它是做什么用的呢?从代码的实现上来看,其持有一个工厂实例,如果这个工厂实例已经被实例化,那就直接调用工厂创建具体的日志类;如果还没有实例化,就读取相关的配置文件,根据配置来实例化相应的工厂类,然后调用工厂类创建产品。我们可以看到这一小段代码中使用了单例模式和简单工厂模式;单例模式避免每次获取Log对象的时候读取、解析配置文件、初始化相关的工厂类等繁琐的工作;简单工厂模式封装了具体工厂类的实例化,间接的负责具体产品的创建,这样客户就不需要依赖具体的工厂类,直接调用getLog就可以了。具体代码如下

public abstract class Log {

static LogFactory logFactory;

//使用简单工厂模式,根据配置初始化具体的工厂

public static synchronized Log getLog(String name) {

if (logFactory==null) {

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

// if logging.properties is available on the classpath

if (classLoader.getResource("logging.properties")!=null) {

logFactory = new Jdk14LogFactory();

// if log4j is available on the classpath

} else if (isLog4jAvailable(classLoader)) {

logFactory = new Log4jLogFactory();

} else {

logFactory = new Jdk14LogFactory();

}

}

return logFactory.getLog(name);

}

static boolean isLog4jAvailable(ClassLoader classLoader) {

try {

Class.forName("org.apache.log4j.LogManager", false, classLoader);

return true;

} catch (ClassNotFoundException e) {

return false;

}

}

//声明具体的log类需要实现的接口

public abstract void error(String msg);

public abstract void error(String msg, Throwable exception);

public abstract boolean isInfoEnabled();

public abstract void info(String msg);

public abstract void info(String msg, Throwable exception);

public abstract boolean isDebugEnabled();

public abstract void debug(String msg);

public abstract void debug(String msg, Throwable exception);

public abstract boolean isTraceEnabled();

public abstract void trace(String msg);

public abstract void trace(String msg, Throwable exception);

public abstract boolean isWarnEnabled();

public abstract void warn(String msg);

public abstract void warn(String msg, Throwable exception);

}

Log4jLog实现了Log定义的一些结构,并将相应的接口需要完成的工作委托给org.apache.log4j.Logger来实现,具体代码如下

public class Log4jLog extends Log {

org.apache.log4j.Logger log;

public Log4jLog(org.apache.log4j.Logger log) {

this.log = log;

}

public void error(String msg) {

log.error(msg);

}

public void error(String msg, Throwable exception) {

log.error(msg, exception);

}

public boolean isInfoEnabled() {

return log.isInfoEnabled();

}

public void info(String msg) {

log.info(msg);

}

public void info(String msg, Throwable exception) {

log.info(msg, exception);

}

public boolean isDebugEnabled() {

return log.isDebugEnabled();

}

public void debug(String msg) {

log.debug(msg);

}

public void debug(String msg, Throwable exception) {

log.debug(msg, exception);

}

public boolean isTraceEnabled() {

return log.isTraceEnabled();

}

public void trace(String msg) {

log.trace(msg);

}

public void trace(String msg, Throwable exception) {

log.trace(msg, exception);

}

public boolean isWarnEnabled() {

return log.isEnabledFor(Level.WARN);

}

public void warn(String msg) {

log.warn(msg);

}

public void warn(String msg, Throwable exception) {

log.warn(msg, exception);

}

}

同样的Jdk14Log作为具体的产品类,其也将相应的工作委托给java jdk提供的日志类来实现产品基类Log的接口,具体代码如下

public class Jdk14Log extends Log {

Logger log;

public Jdk14Log(Logger logger) {

this.log = logger;

}

public void error(String msg) {

log.log(Level.SEVERE, msg);

}

public void error(String msg, Throwable exception) {

log.log(Level.SEVERE, msg, exception);

}

public boolean isInfoEnabled() {

return log.isLoggable(Level.INFO);

}

public void info(String msg) {

log.log(Level.INFO, msg);

}

public void info(String msg, Throwable exception) {

log.log(Level.INFO, msg, exception);

}

public boolean isDebugEnabled() {

return log.isLoggable(Level.FINE);

}

public void debug(String msg) {

log.log(Level.FINE, msg);

}

public void debug(String msg, Throwable exception) {

log.log(Level.FINE, msg, exception);

}

public boolean isTraceEnabled() {

return log.isLoggable(Level.FINEST);

}

public void trace(String msg) {

log.log(Level.FINEST, msg);

}

public void trace(String msg, Throwable exception) {

log.log(Level.FINEST, msg, exception);

}

public boolean isWarnEnabled() {

return log.isLoggable(Level.WARNING);

}

public void warn(String msg) {

log.warning(msg);

}

public void warn(String msg, Throwable exception) {

log.log(Level.WARNING, msg, exception);

}

}

LogFactory作为工厂的基类,其提供了具体工厂类需要实现的创建接口getLog,代码如下

public interface LogFactory {

Log getLog(String name);

}

Log4jLogFactory实现工厂接口的方法,负责实例化Log4jLog代码如下

public class Log4jLogFactory implements LogFactory {

public Log getLog(String name) {

return new Log4jLog(LogManager.getLogger(name));

}

}

Jdk14LogFactory也实现工厂接口的方法,负责实例化Jdk14Log

public class Jdk14LogFactory implements LogFactory {

public Log getLog(String name) {

return new Jdk14Log(Logger.getLogger(name));

}

}

工厂方法模式的优劣

工厂方法模式抽象出工厂基类,使其只提供创建产品的接口,将创建具体产品的职责下放到工厂子类中,同时每个工厂子类只负责创建一种产品,解除了简单工厂类对所有产品的依赖,所以当我们新增产品的时候,只要同时新增相应的工厂类就可以了。但是如果仔细观察我们就会发现,使用工厂方法模式时,客户端需要决定实例化哪个工厂来创建产品,这个选择判断的问题还是存在的,其实,工厂方法把简单工厂的内部判断逻辑转移到了客户端代码来进行,在添加新的产���时,本来是修改工厂类,而现在是修改客户端。0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

seo服务器渲染_关于SSR( 服务端渲染 )其利与弊是什么?

服务端渲染(SSR)原理和客户端(CSR)渲染区别一、服务端渲染(SSR)是什么服务端渲染简单来说就是:用户使用的浏览器浏览的都是一些没有复杂逻辑的、简单的页面,这些页面都是在后端将 ht…

个人博客系统服务器,服务器搭建WordPress个人博客网站

WordPress 是世界上使用最广泛的博客系统之一,是一款开源的PHP软件。有丰富的插件模板资源,使用WordPress可以快速搭建独立的博客网站。WordPress-Logo-PNG-Picture.png本教程软件环境基于CentOS 6.8 64位,从配置LNMP环境开始一步步搭建属于你…

简单用户登录网站(HttpServlet1.2版本)

案例说明:当用户尚未登录就访问欢迎界面时,页面跳转到登录界面,并显示提示信息; 若用户填写的信息与固定用户信息不一致时,登录界面显示错误提示信息;否则跳转到欢迎页面,显示用户名信息. 新建Login2.java -- 用户登录界面,当用户信息输入错误时,会显示提醒信息.(当用户直接访问…

linux服务器如何上传网站,Linux服务器如何发布asp.net网站

ASP.NET core是一个用于net程序跨平台的框架,在此基础上会重写windows、Linux,以实现所有net程序、网站的跨平台。该开发框架主要用于构建基于云的现代web应用。.net开发应用运行于windows平台,由于成本原因而大量使用免费Linux平台&#xff…

通过url账号密码登录其他网站_记一次巨水的网站测试

01本人菜鸡,大佬们亲喷~长话短说就是得到了授权测试一下网站,事先说了网站是前后端分离的。整个过程没有啥骚操作,都比较基础。02给了一个url,由于这是公司某业务系统的管理口,只有一个登录界面。如下图。常规测试下登…

没有限制的搜索引擎_一个合格的SEO人员必须了解搜索引擎的基本工作原理

许多看似混乱的SEO原则和技术,实际上,从搜索引擎的原理来看,都是自然而然的事情。一个合格的SEO必须了解搜索引擎的基本工作原理。今天牛叔将带您了解搜索引擎的原理。SEO就是在保证用户体验的基础上,尽可能迎合搜索引擎。不同于对…

win7作网站服务器,win7系统做网站服务器

win7系统做网站服务器 内容精选换一换当您想在Internet上通过域名访问您的网站时,可以通过华为云的云解析服务为域名添加解析记录。例如,搭建一个网站服务器,采用IPv4格式的弹性IP地址。如果想要实现通过域名“example.com”及其子域名“www.…

香港云服务器网站备案,中国香港云服务器网站备案

中国香港云服务器网站备案 内容精选换一换安全组类似防火墙功能,是一个逻辑上的分组,用于设置网络访问控制。用户可以在安全组中定义各种访问规则,当弹性云服务器加入该安全组后,即受到这些访问规则的保护。入方向:入方…

搭建“ 双11”大型网站架构必须掌握的 5 个核心知识

每年电商双11大促对背后技术人都是一次大考,阿里数据库团队表示。经过9年的发展,双11单日交易额从2009年的0.5亿一路攀升到2017年的1682亿,秒级交易创建峰值达到了32.5万笔/秒。支撑这一切业务指标的背后,是底层技术体系的一次次迭…

让网站永久拥有HTTPS - 申请免费SSL证书并自动续期

为什么要用HTTPS 网站没有使用HTTPS的时候,浏览器一般会报不安全,而且在别人访问这个网站的时候,很有可能会被运营商劫持,然后在网站里显示一些莫名其妙的广告。 有HTTPS的时候,通俗地讲所有的数据传输都会被加密&…

gif分解工具_活用这些网站,轻松制作高级GIF动图

昨天,给大家写了哪些可以用来辅助运营作图的站点,实际上还有很多,作为即使不做全栈运营也得具备到处搜罗这些好站点的能力。很多做新媒体运营的同学,其实更多是要做配图,除了常规的头图之外,更多是文中的配…

网站服务器数据库没有权限怎么办,服务器数据库权限没有开启

服务器数据库权限没有开启 内容精选换一换安装Agent后,你才能开启数据库安全审计。通过本节介绍,您将了解如何在Linux操作系统的节点上安装Agent。Windows操作系统的Agent安装请参见安装Agent(Windows操作系统)。已成功购买数据库安全审计实例&#xff0…

php 随机在文章中添加锚文本_网站中锚文本作用

锚文本定义:锚文本又称锚文本链接,英文名叫anchortext,锚文本实际上是建立了文本关键词与URL链接的关系,锚文本的代码。锚文本可锚文本以作为锚文本所在的页面的内容的评估。正常来讲,页面中增加的链接都会和页面本身的…

切换节点服务器网站,服务器手动切换节点

服务器手动切换节点 内容精选换一换1、集群当前的节点数较多,可以选择将部分节点进行删除,对集群进行缩容操作以同时节省费用。2、集群中某个节点出现异常且无法手动恢复后,可使用节点删除将该节点进行删除操作,随后根据需要再重新…

网页设计html图片滚动特效,网站设计|滚动特效全面讲解!

在视差滚动网页的设计上,无论是移动端还是桌面端,如今的设计师都有了足够深入的探索,并且对于功能和体验上的挖掘,都有了比较成熟的经验。无论是导航悬停式的滚动还是水平滚动和分屏3D特效,视差滚动这一设计趋势已经深…

网站服务器建立数据库连接时出错,[SqlException (0x80131904): 在建立与服务器的连接时出错...

[SqlException (0x80131904): 在建立与服务器的连接时出错在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)说…

百度SEO,该什么时间使用Nofollow?

在百度SEO过程中,每一个SEO人员,手中可利用的资源都是有限的,因此,在页面优化的时候,特别对于新站而言,我们应该学会善用权重。 这可能让很多SEO新人感觉错愕,实际上一个页面的权重&#xff0c…

php mysql 架构_【原创】php+mysql下,对网站架构方面的一些认识(以我维护的站点为例)...

因涉及到关键信息,本文删除相关配图。但51CTO在删之前已经收录本文,目前网站架构一般分成负载均衡层、WEB层和数据库层负载均衡层-- LVS,WEB层--使用了nginxweb服务器,数据库层--我们使用了db集群方案。【应广大网友要求&#xff…

为何大量网站不能抓取?爬虫突破封禁的6种常见方法

为何大量网站不能抓取?爬虫突破封禁的6种常见方法 在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长。今天大众好像更倾向于用“网络数据采集”,有时会把网络数据采集程序称为网络机器人(bots)…

网页左侧导航栏点击怎么显示右侧内容_科普:域名购买后怎么建站、设计网页...

现在建设自己的网站,已经成了很多企业、工作室、个人的重要需求。要想开始建站,你需要有自己的网站域名,域名可以直接在阿里云、上线了等网站购买。有域名 建站可以自己做吗?当然是可以的,接下来就教下大家域名购买后怎…