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. 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 以下介绍PY32F0系列在 ...

  2. 探讨下如何更好的使用缓存 —— Redis缓存的特殊用法以及与本地缓存一起构建多级缓存的实现

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 通过前面的文章,我们一起剖析了Guav ...

  3. docker配置阿里云加速

    登录阿里云找到镜像加速 搜索容器镜像服务,进入管理控制台 找到镜像加速器,根据下面配置好即可 centos7.7x64例子 sudo mkdir -p /etc/docker sudo tee /et ...

  4. SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案

    目录 实现动态SQL的四种方式: 1.XML配置 2.脚本SQL 3.在方法中构建SQL 4.结构化SQL 关于动态SQL的List传值错误问题 1.错误代码 2.解决错误 实现动态SQL的四种方式: ...

  5. html 引入 js 代码的几种方式

    一.普通加载 <script src="./abc.js"></script> 二.内嵌 <script> JavaScript 代码 < ...

  6. PowerToys 微软效率工具包 使用教程

    今天给大家介绍一款 非常实用的微软工具包 里面包含 快捷键的使用 颜色选择器 键盘管理器 屏幕标尺 鼠标实用工具等众多高效工作的功能 还是蛮出彩的 下载 PowerToys⇲ 安装教程 1.双击文件运 ...

  7. 【Oculus Interaction SDK】(十二)Meta Quest 如何开启透视(Passthrough)

    前言 前段时间 Oculus 的 SDK 频繁更新,很多已有的教程都不再适用于现在的版本了.本系列文章的主要目的是记录现版本常见功能的实现方法,便于自己后续开发.当然,不排除我文章刚写完 SDK 又变 ...

  8. 关于vue项目和内嵌iframe页面之间的通信问题

    最近项目中遇到一个与内嵌iframe页面之间通信的问题,起初与原生之间通信很简单,没想到过与vue项目通信的问题,霎时间一脸懵*啊,百度了一下,原来是那么简单,这里记录下以供下次参考 //vue页面 ...

  9. WHAT IS PPM Encoder ?

    About PPM Encoder The PPM encoder allows to encode up to 8 PWM (pulse width modulated) signals into ...

  10. TextView 走马灯效果不生效

    TextView 控件需要添加以下必要的属性: <TextView android:ellipsize="marquee" android:focusable="t ...