350 likes | 470 Views
创建模式复习. 1 简单工厂方法. 2 工厂方法. 3 抽象工厂模式 (Abstract Factory). 4 建造模式( Builder). 5 原型:深浅复制. UML 类图符号说明-继承. UML 类图符号说明-实现接口. UML 类图符号说明-关联. UML 类图符号说明-聚合. UML 类图符号说明-组合. 练习 1 不同格式图片处理问题. 有不同格式的图片 (jpg,bmp,gif...) 要求能对这些图片处理,得到缩略图( resize ); 画出类图,实现核心代码。. 代码.
E N D
UML类图符号说明-关联 UML类图符号说明-聚合 UML类图符号说明-组合
练习1 不同格式图片处理问题 • 有不同格式的图片(jpg,bmp,gif...) • 要求能对这些图片处理,得到缩略图(resize); • 画出类图,实现核心代码。
代码 public class ImgProcessorFactory public static ImgProcessor createImgProcessor(String format){ if(format.equals(“jpg”){ return new JpgProcessor(); }else if(format.equals(“bmp”)){ return new BmpProcessor } ...... } }
代码 public Interface ImgProcessor{ public byte[] resizeImg(byte[] data); } public class JpgProcessor implements ImgProcessor{ public byte[] resizeImg(byte[] data){ ...... } }
代码 .... String format=getPicFormat(); ImgProcessor proc=ImgProcessor(format); proc.resize(data) ....
练习2 不同操作系统构建控件问题 • 很多操作系统上有常见控件(Component),例如Button,Choice,不同操作系统上,这些控件都是Component的子类,其表现方式不完全相同。 • 如何规划这些控件的创建方式,才能满足在不同的操作系统上,显示不同的控件?
实现代码 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); }
练习3 如何不修改代码达到改变载入不同类的目的? • 调整上述程序代码,使得加入新的操作系统支持或者新的组件的时候,不需要修改类厂的代码。
配置文件-工厂方法的完善 ... <ImgProcessor> <format>jpg</format> <class>cn.edu.tjy.JpgProcessor</class> </ImgProcessor> <ImgProcessor> <format>bmp</format> <class>cn.edu.tjy.BmpProcessor</class> </ImgProcessor> ...
抽象工厂方法的完善 <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>
工厂方法/抽象工厂方法其他例子 • 不同打折的计算方式 • 不同类型文档的存储、表现 • ......
练习4 工具类应当如何实现? • 一个项目,其中有若干配置信息,还有若干工具方法,如何设计类结构安排这些方法才合理?
计数器实现的一个错误例子 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}; }
计数器的单例实现 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){...} ... }
练习6 文档查询的优化 • 一个办公自动化系统,其中有一个文档表,其中包括最初编辑者、最后修改者、初级审核者、最终审核者,文档表数据量很大(>5M),如何将文档标题以及几个作者的名字快速显示出来?
练习8 如何实现多个网站的计数? • 多例模式 • 一个map,key为网站ID,value为Counter
练习9 如何对所有对象的缓存、淘汰、自动载入?
练习10 如何实现上述计数器的快速存盘? • 如何实现定时存盘,同时存盘的时候尽可能不影响网站的访问。
练习10 如何实现上述计数器的快速存盘? • 采用clone方法 public synchronzied Counter[] getCounter{ Counter[] result; for counter in counters{ result[i]=counter.clone(); } return result; }