技术图文:03 结构型设计模式(上)

结构型设计模式(上)

本教程主要介绍一系列用于如何将现有类或对象组合在一起形成更加强大结构的经验总结。

知识结构:

图2 围棋软件界面效果图

Sunny 软件公司开发人员通过对围棋软件进行分析,发现在围棋棋盘中包含大量的黑子和白子,它们的形状、大小都一模一样,只是出现的位置不同而已。

如果将每一个棋子都作为一个独立的对象存储在内存中,将导致围棋软件在运行时所需内存空间较大,如何降低运行代价、提高系统性能是 Sunny 公司开发人员需要解决的一个问题

为了节约存储空间,提高系统性能,Sunny 公司开发人员使用共享技术来设计围棋软件中的棋子,其基本结构如下图所示:

(3)围棋棋子工厂类:

(4)客户端:

输出结果如下图所示:

图5 享元模式类图

  • (抽象享元类):通常是一个接口或抽象类,在抽象享元类中要将内部状态和外部状态分开处理,通常将内部状态作为享元类的属性,而外部状态通过注入的方式添加到享元类中。
  • (实体享元类):它实现/继承了抽象享元类,其实例称为享元对象。
  • (非共享实体享元类):并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享实体享元类,当需要一个非共享实体享元类的对象时可以直接通过实例化创建。
  • (享元工厂类):用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的实体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合,可以结合 简单工厂模式 进行设计。当用户请求一个实体享元对象时,享元工厂提供一个存储在享元池中已经创建的实例或者创建一个新的实例(如果不存在的话),返回新创建的实例并将其存储在享元池中。在一个系统中,通常只有唯一一个享元工厂,因此可以使用 单例模式 进行享元工厂类的设计。

注意:享元模式 需要维护一个记录了系统已有的所有享元对象的列表,而这本身需要耗费资源。另外,为了使享元对象可以共享,需要将一些状态外部化,使得程序逻辑复杂化。因此,应当在有足够多的实例对象可供共享时才值得使用享元模式。

享元模式与字符串

C# 语言中,如果每次执行类似的操作时都创建一个新的字符串对象将导致内存开销很大,因此如果第一次创建了内容为“abcd”的字符串对象,下一次再创建相同的字符串对象时会将它的引用指向,不会重新分配内存空间,从而实现了“abcd”在内存中的共享。

见以下程序代码:

图7 文件加密模块结构图

实现代码如下:

(1):充当文件读取的子系统类。

internal class FileReader{    public string Read(string fileNameSrc)    {StringBuilder sb = new StringBuilder();try{    FileStream fs = new FileStream(fileNameSrc, FileMode.Open);    int data;    while ((data = fs.ReadByte()) != -1)    { sb.Append((char) data

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月12日
下一篇 2020年10月12日

相关推荐