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. 期望与概率 dp

    期望与概率 dp \(\text{By DaiRuiChen007}\) I. [洛谷4316] - 绿豆蛙的归宿 \(\text{Link}\) 思路分析 DAG 上做期望 dp,可以爆搜,也可以拓 ...

  2. Linux 查找某一线程是否已运行,并启动的方法

    参考资料:(3条消息) [Linux]守护线程自动重启某个程序的3种常用办法_L7256的博客-CSDN博客_守护进程 自动重启 方法一:使用编写一个监控APP的脚本 start.sh脚本如下:exp ...

  3. 基础文之-----typeof 和 instanceof

    为了巩固基础,我会通过实例来详细说明,让我们一起搞懂 typeof 和 instanceof. <!DOCTYPE html> <html lang="en"&g ...

  4. java反序列化基础

    前言:最近开始学习java的序列化与反序列化,现在从原生的序列化与反序列化开始,小小的记录一下 参考文章:https://blog.csdn.net/mocas_wang/article/detail ...

  5. P18_Day2.学习目标

    能够使用 WXML 模板语法渲染页面结构 能够使用 WXSS 样式美化页面结构 能够使用 app.json 对小程序进行全局性配置 能够使用 page.json 对小程序页面进行个性化配置 能够知道如 ...

  6. 随机森林RF模型超参数的优化:Python实现

      本文介绍基于Python的随机森林(Random Forest,RF)回归代码,以及模型超参数(包括决策树个数与最大深度.最小分离样本数.最小叶子节点样本数.最大分离特征数等)自动优化的代码.   ...

  7. 关于opencv3.2的parallel_for_函数不支持bind function的处理(基于ch8代码)

    1.换opencv4 2.修改程序 改程序针对slambook2/ch8/direct_method.cpp #include <opencv2/opencv.hpp> #include ...

  8. 2021级《JAVA语言程序设计》上机考试试题8

    专业教师功能页: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  9. 2022年4月第十三届蓝桥杯省赛C组C语言 习题解析(每日一道)

    本题总分:5 分[问题描述]小蓝要把一个字符串中的字母按其在字母表中的顺序排列.LANQIAO 排列后为 AAILNOQ.//用的冒泡排序 https://blog.csdn.net/superman ...

  10. python爬虫(含scrapy)

    python爬虫 1.解析HTML: lxml 是一种python编写的库,可以迅速.灵活的处理xml和html 使用:根据版本的不同,有如下两种: 形式1: from lxml import etr ...