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. 【力扣】nSum问题模板

    nSum问题模板 两数之和.三数之和.四数之和. private List<List<Integer>> nSum(int[] nums, long target, int s ...

  2. 如何通过Java应用程序将 PDF转为Word文档

    众所周知,PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性,在工作中可以有效避免别人无意中对文档内容进行修改.但与此同时,也妨碍了对文档的正常的修改.这时我们可以将PDF转为Word文档进 ...

  3. GIT安装步骤记录以及Git 常用命令,忽略文件,推送本地代码到仓库示例以及报错解决

    下载 下载地址 git-scm.com 或 gitforwindows.org 安装(凡是下面没有给出图片的,都按默认选项就行) 选择安装组件 调整你的 path 环境变量 第一种是仅从 Git Ba ...

  4. 使用json数据动态创建表格2(多次绘制第一次简化 var tr=tbody.insertRow();)

    <!DOCTYPE HTML> <html> <head> <title>动态创建表格</title> <meta charset=& ...

  5. (原创)【B4A】一步一步入门01:简介、开发环境搭建、HelloWorld

    一.前言 作者注:絮絮叨叨,可跳过不看. 一直有开发跨平台软件的需求.因为我的主力是C# ,所以当MAUI出现后,我欣喜若狂的开始学习研究.但是经历了两个月左右的时间,我弃坑了,我发现MAUI不是我能 ...

  6. 宇宙无敌搞笑轻松弄懂java动态代理

    https://www.cnblogs.com/ferryman/p/13170057.html jdk动态代理和cglib动态代理区别 https://blog.csdn.net/shallynev ...

  7. Java入门与进阶P-4.3+P-4.4

    循环控制 素数 只能被1和自己整除的数,不包括1 2 3 5 7 11 13 17 19 ... 1.循环控制语句 可以在满足循环条件的请款下,反复的执行某一段代码,这段被重复执行的代码被称为循环体语 ...

  8. Flutter入门资料推荐

    前言 群里很多入门小白不知道如何入门 Flutter,水一篇文章简单介绍下本人学习过程中一些参考资料,方便 Flutter 小白少走弯路. 非权威,推荐只针对本人经验来的说,大佬们不喜勿喷! 资料列表 ...

  9. 移动 WEB 布局方式之 rem 适配布局 ---- 苏宁首页案例制作

    一.技术选型 二.搭建相关文件夹结构 三.设置视口标签以及引入初始化样式 四.设置公共common.less 文件 common.less //设置常见的屏幕尺寸大小,修改里面的html 文字大小 / ...

  10. 【一句话】CAP原则

    首先一句话: 如果出现网络分区(P),持有旧数据的节点是否要继续提供服务,提供就保证了可用(A),但数据不一定新,放弃了C:如果不提供服务,则意味着放弃了可用性A,但是保证数据一致(C). 我的理解: ...