1 / 35

创建模式复习

创建模式复习. 1 简单工厂方法. 2 工厂方法. 3 抽象工厂模式 (Abstract Factory). 4 建造模式( Builder). 5 原型:深浅复制. UML 类图符号说明-继承. UML 类图符号说明-实现接口. UML 类图符号说明-关联. UML 类图符号说明-聚合. UML 类图符号说明-组合. 练习 1 不同格式图片处理问题. 有不同格式的图片 (jpg,bmp,gif...) 要求能对这些图片处理,得到缩略图( resize ); 画出类图,实现核心代码。. 代码.

renata
Télécharger la présentation

创建模式复习

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 创建模式复习

  2. 1 简单工厂方法

  3. 2 工厂方法

  4. 3 抽象工厂模式(Abstract Factory)

  5. 4 建造模式(Builder)

  6. 5 原型:深浅复制

  7. UML类图符号说明-继承

  8. UML类图符号说明-实现接口

  9. UML类图符号说明-关联 UML类图符号说明-聚合 UML类图符号说明-组合

  10. 练习1 不同格式图片处理问题 • 有不同格式的图片(jpg,bmp,gif...) • 要求能对这些图片处理,得到缩略图(resize); • 画出类图,实现核心代码。

  11. 代码 public class ImgProcessorFactory public static ImgProcessor createImgProcessor(String format){ if(format.equals(“jpg”){ return new JpgProcessor(); }else if(format.equals(“bmp”)){ return new BmpProcessor } ...... } }

  12. 代码 public Interface ImgProcessor{ public byte[] resizeImg(byte[] data); } public class JpgProcessor implements ImgProcessor{ public byte[] resizeImg(byte[] data){ ...... } }

  13. 代码 .... String format=getPicFormat(); ImgProcessor proc=ImgProcessor(format); proc.resize(data) ....

  14. 练习2 不同操作系统构建控件问题 • 很多操作系统上有常见控件(Component),例如Button,Choice,不同操作系统上,这些控件都是Component的子类,其表现方式不完全相同。 • 如何规划这些控件的创建方式,才能满足在不同的操作系统上,显示不同的控件?

  15. 类图

  16. 实现代码 public abstarct class ComponentFactory{ public static ComponentFactory createComponentFactory(OS os){ if(os.isWindows()){ return new WindowsFactory(); }else if(os.isUnix()){ return new UnixFactory(); } ...... } public abstract createComponent(String compType); }

  17. 练习3 如何不修改代码达到改变载入不同类的目的? • 调整上述程序代码,使得加入新的操作系统支持或者新的组件的时候,不需要修改类厂的代码。

  18. 配置文件-工厂方法的完善 ... <ImgProcessor> <format>jpg</format> <class>cn.edu.tjy.JpgProcessor</class> </ImgProcessor> <ImgProcessor> <format>bmp</format> <class>cn.edu.tjy.BmpProcessor</class> </ImgProcessor> ...

  19. 抽象工厂方法的完善 <OperationSystem> <osname>win</osname> <Factory>WinComponentFactory</Factory> <component> <type>Button</type> <class>cn.edu.tju.WinButton</class> </component> <component> <type>Choice</type> <class>cn.edu.tju.WinChoice</class> </component> </OperationSystem>

  20. 工厂方法/抽象工厂方法其他例子 • 不同打折的计算方式 • 不同类型文档的存储、表现 • ......

  21. 练习4 工具类应当如何实现? • 一个项目,其中有若干配置信息,还有若干工具方法,如何设计类结构安排这些方法才合理?

  22. 练习5 如何实现一个网站计数器

  23. 计数器实现的一个错误例子 public class Counter { private int static count=0; static{ read count from database; } public static void inc(PagetContext context){ count++; } public static int getCount(){return count}; }

  24. 计数器的单例实现 public class Counter { private int count=0; private Counter counter=null; pubic synchronzied static Counter getCounter(){ if(counter==null){counter=new Counter()}; return counter; } public void inc(PagetContext context){...} ... }

  25. 练习6 文档查询的优化 • 一个办公自动化系统,其中有一个文档表,其中包括最初编辑者、最后修改者、初级审核者、最终审核者,文档表数据量很大(>5M),如何将文档标题以及几个作者的名字快速显示出来?

  26. 查询的优化-采用多例模式

  27. 练习7 如何实现多个网站的计数?

  28. 练习8 如何实现多个网站的计数? • 多例模式 • 一个map,key为网站ID,value为Counter

  29. 练习9 如何对所有对象的缓存、淘汰、自动载入?

  30. 练习10 如何实现上述计数器的快速存盘? • 如何实现定时存盘,同时存盘的时候尽可能不影响网站的访问。

  31. 练习10 如何实现上述计数器的快速存盘? • 采用clone方法 public synchronzied Counter[] getCounter{ Counter[] result; for counter in counters{ result[i]=counter.clone(); } return result; }

More Related