在这篇教程中,我们将会试图弄明白,如何使用多接口与工厂模式去生成一个真正的去耦合架构的框架(a truly decoupled architecture framework)。在例子中我们将会使用一个三级架构,并使用多接口与工厂模式去展示我们如何将一个三级架构转变成一个真正的去耦架构。
以前我曾经写过并录制了一些有关设计模式,UML,FPA,企业模块等等一些视频。你可以在http://www.questpond.com 看到它们。
你可以在 http://www.questpond.com/SampleDotNetInterviewQuestionBook.zip 下载到400本我关于.net FAQ的电子书。
所有人都偏爱三级架构。
ok。大家都知道三级架构是什么。我将会稍微讨论一下它,然后我们开始认真考虑一些有关三级架构的争议之处。基本上我们知道,三级架构中,UI代码 属于客户端部分,业务对象是只是一些有关业务验证的业务类。数据访问层处理所有有关的数据库操作。到这里为止,一切都相当完美。
如果我们分析一下这三个部分,就会注意到很重要的一点,其中的业务验证部分是相当反复无常(高度易变)的。业务规则的改变就相当于业务方式的改变。
第二易变的是客户端部分。人们倾向于多客户端支持,这依赖于用户接口。相对于业务对象来说,这并不是那么反复易变。即使用户想要改变它,也不会急于一时。而业务验证一旦变化则需要即刻的改变。
数据访问是最不常改变的部分。至少在我所有工程项目中,我依然遇到了一些需要经常移动数据库的项目。当一有需要的时候就会被移动,但这不会紧迫,同时它会被作为一个移植项目对待。
因此结论就是,业务部分是最容易频繁更改的,当它发生变化的时候,代码需要即刻进行修正。接下来是UI,最后才是数据库。
控制连锁变化
下面是一个叫做”clsInvoiceHeader”的业务类。你可以看到在代码部分,用户接口直接设定成业务对象。因此用户接口可以直接使用这个类。
clsInvoiceDetail objInvoiceDetail = new clsInvoiceDetail ();
objInvoiceDetail.CustomerName = txtCustomerName.Text;
objInvoiceDetail.CustomerAddress = txtCustomerAddress.Text;
objInvoiceDetail.InvoiceComments = txtComments.Text;
objInvoiceDetail.InvoiceDate=Convert.ToDateTime(txtInvoiceDate.Text);
另一方面,当业务对象连接数据访问层的时候,它会将值以普通的.NET数据类型发送出去。你会看到一个 DAL 部件‘InsertInvoiceDetails’如何发送普通的.NET数据类型。
public class clsInvoiceDetail
{
public void Insert(int _InvoiceReference)
{
clsInvoiceDB objInvoiceDB = new clsInvoiceDB();
objInvoiceDB.InsertInvoiceDetails(_Id, _InvoiceReference, _ProductId, _Qty);
}}
因此,当业务对象发生变化的时候,会发生什么?它会把变化传导到所有的3个层。那意味着你需要重新编译整个工程。
接口与工厂模式的魅力
我们如何在所有的层次之间控制这种连锁反应呢?答案是通过接口与工厂模式。让我们先为‘clsInvoiceDetail’ 类创建一个接口。下面是接口代码。
public interface IInvoiceDetail
{
string InvoiceReferenceNumber
{
get;
}
string CustomerName
{
set;
get;
}
string CustomerAddress
{
set;
get;
}
string InvoiceComments
{
set;
get;
}
DateTime InvoiceDate
{
set;
get;
}}
第二步,我们定义一个类用来创建‘clsInvoiceDetails’对象。下面是同样的代码。
public class FactoryFinance
{
public static IInvoiceDetail getInvoiceDetail()
{
return new clsInvoiceDetail();
}
}
至此,客户只能通过作为代理的接口来引用以及使用工厂来创建具体的类‘ClsInvoiceDetail’。用这种方式,客户并不需要知道具体类 ‘ClsInvoiceDetail’的信息。工厂类的引进是为了避免在客户端引进新的关键字。如果我们在UI中有使用新关键字的客户端,并且UI直接与 具体类信息接触,这会导致严重的耦合。
IInvoiceDetails objInvoiceDetail = FactoryFinance.GetInvoiceDetails();
objInvoiceDetail.CustomerName [...]
分享到:
相关推荐
使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这两 种情况分开进行。 设计模式之 ...
创建型模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式等。这些模式各有其特定的应用场景和优势。 首先,单例模式是一种常见的创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。...
- **解耦**:抽象工厂模式不仅让用户与具体产品的实现解耦,还让用户与创建这些产品的类脱耦。这意味着用户可以更加关注产品本身的功能,而不是它们是如何被创建出来的。 #### MVC模式 - **概念澄清**:MVC(Model...
例如,在EJB调用中,`em.create()`就类似于工厂模式的`AFactory.create()`,用于生成EJB对象,实现了解耦和隐藏底层实现。 Façade模式在J2EE中也扮演着重要角色,特别是在会话Bean与实体Bean的交互中。会话Bean...
本文档是软件体系结构综合复习题,涵盖了软件设计模式、面向对象设计、抽象工厂模式、适配器模式、桥接模式、组合模式等多个知识点。下面是每个问题的知识点总结: 1. 设计模式的定义和目的:设计模式是一种总结和...
设计模式是软件设计中的重要工具,论文可能会提及一些经典的设计模式,如工厂模式、观察者模式、装饰器模式等,这些模式都是在特定场景下,为实现高内聚和低耦合提供了解决方案。例如,工厂模式可以隐藏对象创建的...
架构设计不仅关系到系统的整体布局,还涉及到了解耦、分层等多个方面,这些对于提高系统的稳定性和灵活性至关重要。设计模式则是在特定情境下解决常见问题的有效途径之一,通过合理地运用设计模式,可以使代码更加...
- **工厂模式**: - **简单工厂**:提供了一个创建产品族的接口,但并不实现任何创建逻辑。 - **多态工厂**:通过继承实现不同类型的对象创建。 - **抽象工厂**:提供接口为创建一系列相关或相互依赖的对象。 -...
2. **工厂模式**:定义一个创建对象的接口,让子类决定实例化哪一个类。工厂模式使代码更易于扩展,因为它将对象的创建与使用分离。 3. **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定...
3. **利用设计模式**:例如单例模式、工厂模式等可以帮助降低耦合度,提高代码的灵活性和可重用性。 4. **重构**:对于已经存在的高耦合、低内聚的问题,可以通过重构的方式逐步优化代码结构,比如将冗余的代码...
- **设计模式**:是软件设计中常见的解决方案模板,如工厂模式、单例模式等。 这些知识点在软件设计和架构中具有重要价值,理解和应用它们可以帮助创建更灵活、可维护和可扩展的系统。同时,网络通信的考虑和错误...
3. 抽象工厂模式:抽象工厂类负责定义创建对象的接口,具体对象的创建工作由实现抽象工厂的具体工厂类来完成。工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做,成为一个抽象工厂角色,仅负责给出...
工厂模式是一种常用的创建型设计模式,用于封装对象的创建过程。书中介绍了如何设计一个通用的工厂类,以便于创建各种类型的对象,这对于维护大规模的金融应用非常有帮助。 ##### 4.3 C++与Excel的交互 在金融行业...
消息通信在系统架构中起到了解耦的作用,简化了应用的功能,并使得大型软件能够相互协作成为可能。 在应用间消息通信方式中,传统的有信号、Socket通信、远程过程调用(RPC)等方式。Socket通信是一种古老且直接的...
未来随着技术的发展,还可以考虑引入更多先进的技术和理念来优化和完善该项目,比如使用微服务架构、前端框架React或Vue等提升用户体验和技术栈的现代化水平。 以上内容为基于“SSH网上商城项目代码全课程设计”的...