`
禹爸爸
  • 浏览: 80411 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Delphi中的工厂模式

阅读更多

在面向对象的程序设计中,某一功能的实现往往是依赖多个类的协同工作,这当中不必可避免的会有一个核心的关键类,非关键类对关键类的依赖程度比较高(耦合比较紧),关键类的变动会景响到非关键类与其通信。比如在某个MIS系统中,用户数据是存储在文件中的,那么所有数据的读取与保存都依赖与那和与文件进行通信的类。突然某一天客户说要将数据存储到数据库中,那么我们是必要找出所有使用这些与文件通信的类的代码,并使用新写的与数据库通信的类将其替换掉。这个改动量是可想而知的。那么有没有一种好的设计模式能够降低这种情况下的代码改动量呢?

答案是肯定的。使用工厂模式。我们可以定义一个工厂类,提供一系列的创造对象的方法,代替类似TObject.Create的代码,降低类与类之间的耦合。

我们就以前面讲到的情况为例,来说明工厂模式的使用。在系统中我们已经定义了一个负责数据读取的抽像类TDataReader和负责数据保存的抽象类TDataWriter,并分别派生了文件读取类TFileDataReader和文件保存类TFileDataWriter。

//此处仅为说明,其他定义省略
type
TDataReader
=class
private
.......
protected
.......
public
.......
procedureRead;
virtual;abstract;
.......
end;

TDataWriter
=class
private
.......
protected
.......
public
.......
procedureWrite;
virtual;abstract;
.......
end;

TFileDataReader
=class(TDataReader)
private
.......
protected
.......
public
.......
procedureRead;
override;
.......
end;

TFileDataWriter
=class(TDataWriter)
private
.......
protected
.......
public
.......
procedureWrite;
override;
.......
end;

在重构这前,凡是用到数据读取与保存的地方,都是使用类似下面的代码

var
Reader:TFileDataReader;
begin
......
Reader:
=TFileDataReader.Create;
Reader.Read;
......
end;


var
Writer:TFileDataWriter;
begin
......
Writer:
=TFileDataWriter.Create;
Writer.Write;
......
end;

现在客户要求我们将所有的数据存储到数据库中,就意味着我们要再分别从TDataReader类和TDataWriter类派生出两个与数据库通信的类TDBDataReader和TDBDataWriter(之前良好的类继承设计使我们在此省下了许多修工作),然后将类似上面的的Reader和Writer的构建语句改为

Reader:=TDBDataReader.Crette;

Writer:
=TDBDataWriter.Create;

这样的改动也能达到客户的要求,但我们谁也不能保证在此之后不会再有任何的变化,为了不让噩梦重演,我们决定不使用这种修改方式。而是定义一个工厂类,负责创建出我们需要的数据读取类和保存类,即使将来再有变化,我们的修改也仅限于在工厂类内部的改动。

Type
TDataReaderFactory
=class
public
functionCreatReader:TDataReader;
end;

TDataWriterFactory
=class
public
functionCreateWriter:TDataWriter;
end;

implementation

...{TDataReaderFactory}

functionTDataReaderFactory.CreatReader:TDataReader;
begin
Result:
=TDBDataReader.Create;
end;

...{TDataWriterFactory}

functionTDataWriterFactory.CreateWriter:TDataWriter;
begin
Result:
=TDBDataWriter.Create;
end;

在使用到数据读写类的地方,将代码改为

Reader:=TDataReaderFactory.CretteReader;

Writer:
=TDataWriterFactory.CreateWriter;

至此,我们就通过工厂模式实现了客户端代码与数据存取类的松散耦合,也为将来的再修改提供了灵活性。

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    delphi 简单工厂模式

    type TIProduct = class str:string; function Print():string;virtual; end; type TProduct_A = class(TIProduct) private public function Print():string;override; end; type TProduct_B = class...

    Delphi模式编程第一分卷

    第2章 Delphi的模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系与复用 2.2 动态绑定机制 2.2.1 方法绑定 2.2.2 虚方法 2.2.3 多态 2.3 类型转换机制 2.3.1 类型 ...

    Delphi模式编程第二分卷

    4.3.1 利用工厂方法模式设计可动态切换持久层机制的应用 4.3.2 范例小结 第5章 抽象工厂模式(Abstract Factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 ...

    Delphi设计模式讲解代码示例讲解

    3. Delphi设计模式的示例:博客园上有文章详细介绍了Delphi中的设计模式,包括工厂模式、适配器模式等,并通过Delphi代码示例展示了如何实现这些模式。 4. Delphi设计模式的讨论:CSDN博客上有关于Delphi中单例模式...

    delphi数字图像模式识别工程软件设计.zip

    delphi数字图像模式识别工程软件设计,源代码,亲测可用。车牌识别,人工智能,人脸检测等可借鉴该技术。

    Delphi模式编程

    Delphi模式编程 软件工程必备

    delphi实现简单工厂

    delphi 实现简单工厂模式

    Delphi 深度探索(第二版)〖含随书光盘源代码〗

    6.1.1 工厂模式 6.1.2 单例模式(singleton) 6.1.3 建造模式(builder) 6.1.4 原型模式(prototype) 6.2 结构模式 6.2.1 适配器模式(adapter) 6.2.2 合成模式(composite模式) 6.2.3 装饰模式...

    Delphi串口通信工程开发实例导航_配书代码

    (2)如果Delphi中没有NMPOP3控件(位于FastNet)控件组,则程序也无法编译,在Delphi 6 中一般默认都有。(3)程序中用到的图标文件在程序的源代码目录的res文件夹下,读者可以选用自己的图标文件,这里可以任意更改,...

    Delphi5开发人员指南

    11.1.2 在Delphi程序中使用多线程 304 11.1.3 关于线程的滥用 305 11.2 TThread对象 305 11.2.1 TThread基础 305 11.2.2 TThread实例 307 11.2.3 线程的终止 307 11.2.4 与VCL同步 308 11.2.5 一个演示程序 310 ...

    Delphi网络通信协议分析与应用实现pdf清晰

    3.4.2 FTP工作模式 3.5 开发FTP程序的方法 3.6 API开发高级FTP客户端程序 3.6.1 建立工程项目 3.6.2 关键代码分析 3.7 开发FTP服务器 3.7.1 建立工程项目 3.7.2 关键代码分析 第4章 HTTP高级开发 4.1 HTTP...

    Delphi3Des.rar

    Delphi的3Des加解密包括CBC,ECB等模式.把里面的源码文件添加到自己的工程中,调用Form2运行起来即可立见效果!

    精通Delphi数据库设计与实例开发配套光盘

    开发数据库应用系统是一项复杂的工程,而在众多的编程工具中,Delphi在数据库方面的特长尤为突出:它适应于多种数据库结构,包括从客户/服务器模式到多层数据结构模式;具有高效率的数据库管理系统和新一代更先进的...

    数字图像模式识别工程软件设计

    基于图像分析的黄豆质量评估系统 选自《数字图像模式识别工程软件设计》的第一章 用Delphi 代码编写 注释详细

    Delphi XE2的OpenCL控件(可以象TQuery一样使用OpenCL)

    的工具足矣,但在实际工程中,希望还是能够尽可能使用原生的调用方式,控件模式势必会带来一定的性能损失的,这是 无法克服的是一个实际情况,对于某些流式数据处理的计算而言,多次重复使用同一个Kernel对流式数据...

    Delphi封装DLL到IE OCX控件

    将DLL做成RES编译进工程,运行时释放资料保存到系统TEMP目录下调用,WIN32模式下调用一切正常,用Delphi自带的WebBrowser调用也正常,但在IE下调用DLL提示无法加载,望高手解决,谢谢。

    delphi数字图像处理及高级应用书籍及随书源码.zip

    做图像处理、模式识别、车牌识别等特有用,含源码。亲测可用

    Delphi的概要介绍与分析

    Delphi社区也是一个宝贵的资源,社区中聚集了大量的Delphi开发者和爱好者,他们分享经验、解决问题、交流技术,为Delphi的开发者提供了强大的支持。无论是初学者还是资深开发者,都能在Delphi社区中找到适合自己的

    Delphi开发的多层SQL服务端与客户端源码.rar

     在Two-Tier模式中,客户端(Client)程序是直接和服务器的数据源相连的,而Multi-Tier模式,多个客户端连接的是一个应用程序服务器,因为收费是按客户端数计算的,所以,数据库的使用费用比较低。

Global site tag (gtag.js) - Google Analytics