图片读取器和皮肤库设计

图片读取器和皮肤库设计

无论是图片读取器还是皮肤库设计,其实只是点到为止,没有深入做出很好的视觉效果,请见谅。

一、实验目的

1.结合实例,熟练分析并绘制UML类图;

2.熟练使用java实现两种常见的创建型设计模式,包括工厂方法模式、抽象工厂模式。理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。

二、实验要求

  1. 结合实例,正确无误地绘制工厂方法模式、抽象工厂模式的模式结构图;

  2. 要求使用XML和Java反射机制来创建对象。

  3. 使用Java语言实现工厂方法模式、抽象工厂模式实例,代码运行正确无误。

、实验原理

​ 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

​ 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

四、实验步骤、数据记录及处理

1.图片读取器

​ 使用工厂方法模式设计一个程序用来读取各种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),例如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器 (JpgReader)用于读取JPG格式的图片。需充分考虑系统的灵活性和可扩展性。

使用工厂方法模式设计一个程序用来读取各种不同类型的图片格式,针对每一种图片格式都设计一个 图片读取器(ImageReader),例如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。需充分考虑系统的灵活性和可扩展性。

分析:用抽象工厂imageReaderFactory去生产抽象的图片读取器(ImageReader),由于GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器 (JpgReader)用于读取JPG格式的图片。所以得有GifReadFactory和JpgReadFactory这两个工厂以达到产生不同类型的图片读取器。考虑到系统的灵活性和可扩展性,则需要将抽象工厂imageReaderFactory和图片读取器(ImageReader)定义为接口的形式。例如增加PNG图片读取器用于读取PNG格式的图片,只需要实现相应的ImageReader接口和ImageReader Factory接口,增加相应的工厂和图片读取器,没有对原有业务造成影响。客户端Client调用不同的图片读取器读取相应图片的信息。XMLUtil则是运用反射机制提供工厂实例化方法getBean()

根据工厂方法模式用rational rose对题设内容进行uml建模,类图如下所示。

在这里插入图片描述

那么如何实现不同读取器的调度呢?

这就取决于工厂生产哪个图片读取器。这样就从图片读取器的调度转换到不同工厂之间的调度。我们通过改变工厂注册文件config.xml来实现。

在这里插入图片描述

2.皮肤库

某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:
在这里插入图片描述

该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。

分析:抽象皮肤库工厂可以生产多种结构的产品,按钮,文本框,组合框,而每个具体工厂可以生产出同种产品,不同结构的产品,即Spring风格和Summer风格属于不同的具体工厂的产品。

根据抽象工厂模式用ratioal rose 对题设内容进行uml建模,类图如下所示

在这里插入图片描述

考虑到要实现不同的按钮,文本框,组合框,所以每个继承JFrame类。

在这里插入图片描述

五、实验中所出现的问题及解决方案

图片读取器

(1) 配置文件路径不对,这将会导致工厂无法注册?

根据idea控制台打印的路径对比自己填写的路径改正。

(2) 图片格式如何判断?

通过查找资料,发现jdk类库中提供有图片输入流,然后再用迭代器决解。

(3) 图片信息如何判断?

类库中提供有ImageIo,可以读取图片信息。

皮肤库

(1) 如何实现不同颜色的按钮、绿色边文本框、绿色边框组合框?

通过查找资料,以依赖注入的方式,添加按钮JButton,组合框JComBox,文本框JTextField。不同颜色的边框设置方法:

​ setBorder ( BorderFactory.createLineBorder ( Color.GREEN,5 ) )

六、实验结果

(1)图片读取器

Gif图片读取器工厂注册
在这里插入图片描述
选择图片cat.gif,输出结果
在这里插入图片描述

Jpg图片读取器工厂注册
在这里插入图片描述

选择图片2.jpg,输出结果

在这里插入图片描述

(2)皮肤库

Spring风格的工厂注册

在这里插入图片描述

结果展示
在这里插入图片描述

从左到右依次是SpringButton、SpringTextBox、SpringComboBox。

Summer风格的工厂注册

在这里插入图片描述

结果展示

在这里插入图片描述

七、实验心得

图片读取器

首先加深了对设计模式的理解,我认为设计模式是编程套路,这些编程套路从结构上大致是不会改变的,既然是不变的,那么照着这种固定结构,只要完成uml建模,画出类图,那么完成编程是比较容易的。接着谈谈本例应用工厂方法模式解决的看法,联系实际,不同的图片读取器又怎么会在不同的工厂中生产呢?一般地,都会是一个工厂生产出不同的图片读取器,所以我觉得这里用图片读取器案例理解工厂方法模式是有待商榷的。

接着对于工厂方法模式的结构更加深刻。最后就是对于实现实例化的getBean()方法,应用dom模型读取配置文件,积累更多思路。

皮肤库

当用抽象工厂模式实现皮肤库的基本框架后,就是ui处理,抽象工厂模式与工厂方法模式更具有实际意义。

八、项目结构

图片读取器

在这里插入图片描述

在这里插入图片描述

皮肤库

在这里插入图片描述

九、待改进问题

​ 1.实际上在图片读取器中,ImageFormat类可以读取各种格式的图片,让具体图片读取器继承它,就显得有些大材小用,窄化功能的意味。

​ 2.在实现皮肤库中,让每个具体组件继承JFrame,显然组件之间的耦合增加了。

十、源代码

源码地址

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值