19:50:31

《UML 模式和应用》 P322

系统需要支持多种第三方外部服务,例如费用计算,授权服务,库存系统,都具有不同的API, 而且还无法改变。

解决方案之一:

使用 单例模式的工厂对象,适配提供服务

1 )  Adapter

增加一层间接性对象,通过这些对象将不同的外部接口调整为在应用程序内部使用的一致接口。

(对外部服务的适配器,专业化为 资源适配器 resoure adapter

对于选定的外部服务,将使用一个特定的适配器实例来处理。

例如 针对账务系统的 SAP, 当向外部接口发出 postSale请求时,

首先通过适配器进行转换,使其能够通过 HTTPS 上的  SOAP XML 接口来访问 SAP 在局域网上提供的 WebService。


对外服务由不同的接口,那是谁创建了这些适配器,并且如何决定创建哪种类的适配器,

如果使某个领域对象来创建这些适配器,那么领域对象的职责就超过了单纯的应用逻辑(例如销售总额的计算),并且会涉及到与外部软件

构件链接相关的其他内容。

架构设计基本原则之 : 关注分离  separation of concern ,将不同关注分离或模块化为不同领域,以确保内聚。对 GRASP 高内聚原则的应用。

领域层软件对象强调相对单纯的应用逻辑职责,另外一组对象负责关注于外部系统的连接。


2) Factory

简单工厂 (Simple Factory) 或 具体工厂 (Concrete Factory) , 不属于 设计模式, 但应用极为广泛, 也是 GoF 抽象工厂的简化。

定义纯虚构的“工厂” 对象来创建对象。 优势如下

1. 分离复杂创建对象的职责,并将其分配给内聚的帮助者对象

2.隐藏潜在的复杂创建逻辑

3.允许引入提高性能的内存管理策略,例如对象缓存或再生。

3)SingleTon

对类定义静态方法 getInstance, 该方法提供了类的唯一实例,可以通过类的静态方法 getInstance 得到唯一实力的全局可见性。

使用反射或数据驱动方法能够发现正确的类: 从外部特征文件中读取外部特征

在 ServiceFactory 中,决定使用哪个类来创建的逻辑是,

String ClassName = System.getProperty("Accounting.classname");

AccountAdapter = (IAccountAdapter) Class.forName(className).newInstance();

从外部资源读取类的名称,Java 以系统特性文件作为外部元,然后动态装载这个类,此例中局部地

使用了数据驱动设计。

这种设计对于实现适配器类的变化方面做到了 防止变异原则,

无需更改工厂类的源代码,通过修改属性值并且确保新类存在于Java的类路径中。。

3. Register

public class Register{

public void initialize()

{

accountAdapter = ServiceFactory.getInstance().getAccoutnAdapter();

}

}

Software_programming_EnterpriseArch_ServiceWithSingleTonFactory的更多相关文章

随机推荐

  1. 数据库实践丨使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题

    摘要:用户使用Mogdb 2.0.1版本进行业务上线测试,发现在插入数据时,应用日志中提示primary key冲突,用户自查业务SQL没有问题,接到通知后,招手处理故障. 本文分享自华为云社区< ...

  2. Swagger的基本使用

    Swagger简介和使用 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,以及在线接口调试页面等等. ...

  3. UEditor采坑指南

    1.版本选择 GitHub上的最新版(1.5)没有提供后端代码.想要后端代码可以下载历史版本(1.4.3.3). 1.5版本:https://github.com/fex-team/ueditor 1 ...

  4. Kubernetes(k8s)控制器(一):deployment

    目录 一.系统环境 二.前言 三.Kubernetes 控制器 四.Deployment概览 五.创建deployment 六.修改deploy副本数 6.1 kubectl edit deploy ...

  5. springboot跨域解决

    package com.xf.config; import java.io.IOException; import javax.servlet.Filter; import javax.servlet ...

  6. Axios、Vue组件-生命周期、计算属性、Slot插槽、自定义事件、v-router、钩子函数

    Axios:网络通信 <script> var vm =new vue({ el:"#app", data(){ return{ info:{ //返回的数据必须和js ...

  7. Centos7作为VNCserver,本地使用VNCViewer连接

    1.概念 VNC是一个远程连接工具 VNC is used to display an X windows session running on another computer. Unlike a ...

  8. TNF拮抗剂的结构、功能与结核感染_Wallis2008

    中信国健临床通讯 2009年第2期 TNF拮抗剂的结构.功能与结核感染 Robert S. Wallis. THE LANCET Infectious Diseases. 2008; 8:601–61 ...

  9. DESIR队列研究: 早期SpA患者骶髂关节放射学结构损伤的不同定义对结构损伤变化的敏感性

    DESIR队列研究: 早期SpA患者骶髂关节放射学结构损伤的不同定义对结构损伤变化的敏感性 EULAR2015; PresentID: THU0356 SENSITIVITY TO CHANGE OF ...

  10. PostgreSQL 按拼音排序 - convert to GBK/EUC_CN coding

    背景 国内的应用,在文本排序上基本都是按照拼音来进行排序的. 在不同的字符集中,汉字的编码可能不一样,比如UTF8和GBK,其中GBK是按拼音的顺序进行编码的,而UTF8则不是. 所以如果你的数据库使 ...