软件设计模式sdp-第4章.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《软件设计模式sdp-第4章.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 模式 sdp
- 资源描述:
-
1、软件设计模式第4章 GoF创建型模式结构型(Creational)模式 GoF创建型模式的意图是解决对象创建的一类设计问题 比如,需要保证某个类型的对象在运行时只有一个实例,并共享给所有使用该对象的客户端 将一类对象的创建行为复用 保证产品簇不同类型产品对象的创建一致性等提纲 单例模式 原型模式 模式 构造器模式 抽象工厂模式 工厂方法模式单例(Singleton)模式 单例(单例(Singleton)是指目标类()是指目标类(Class)只)只有一个实例对象(有一个实例对象(Object),并且向使用该),并且向使用该对象的客户端提供访问单例的全局方对象的客户端提供访问单例的全局方法法 使用
2、单例模式的场景有 当一个类只能有一个实例,并且客户端需要访问该实例 当一个类的实例化代价很大,且向所有客户端提供无状态的服务(实例状态在程序中通常使用变量或域表达)或不因客户端变化而改变实例状态的服务单例类结构单例类结构使用单例的练习 COS系统的配置信息使用XML格式文件保存,COS启动后,需要向所有客户端(Client)程序共享该配置信息,并提供配置信息访问的接口 需要单独设计一个配置信息类,负责封装配置信息,并向客户端提供服务 配置信息类初始化时,需要将配置信息从XML数据源文件中读取并解析,这属于耗时操作;多次初始化会降低程序性能Configuration单例类图 public cla
3、ss Configuration/cosConfig是静态域,在Configuration类首次加载时初始化private static Configuration cosConfig=createInstance();private Configuration()/私有构造方法/*创建和初始化Configuration对象*/private static Configuration createInstance()Configuration c=new Configuration();/解析XML数据源,初始化creturn c;/*向客户端提供访问c的公共方法*/public static
4、 Configuration getInstance()return cosConfig;/*向客户端提供配置信息访问的接口 */public Result service(Parameter p)/服务实现 /return语句 使用单例时,需要注意以下问题 编程语言中反射和序列化编程语言中反射和序列化/反序列化可能会反序列化可能会破坏单例特破坏单例特性性 多客户端并发访问单多客户端并发访问单例时例时,也可能会破坏,也可能会破坏单例特单例特性性 在软件系统中使用过多的单例对象,会导在软件系统中使用过多的单例对象,会导致使程序性能下致使程序性能下降降 设计单例类时,并不一定要完全遵守设计单例类时
5、,并不一定要完全遵守GoF理理论形式论形式使用单例模式的行业案例1 JDK的Runtime单例类 JDK中的java.lang.Runtime即是一个标准的单例类 java.lang.Runtime定义了许多实例方法,通过对象调用向客户端提供接口 每一个Java应用都有唯一一个Runtime实例,用来与应用的运行时环境交互 public class Runtime /静态私有域 private static Runtime currentRuntime=new Runtime();/*全局静态访问方法 */public static Runtime getRuntime()return cur
6、rentRuntime;/*私有无参构造方法 */private Runtime()/其他代码 使用单例模式的行业案例2 Hibernate框架SessionFactory对象的单例构造 程序员一般在使用Java ORM框架Hibernate时,会将org.hibernate.SessionFactory的实例在自己的应用中构造为单例 org.hibernate.SessionFactory的单例向所有客户端程序共享持久化存储的配置信息和其他 public class HibernateUtil /静态私有域private static final SessionFactory session
7、Factory=buildSessionFactory();/*实例构造方法 */private static SessionFactory buildSessionFactory()try /通过xml配置构建SessionFactory实例 return new Configuration().configure().buildSessionFactory(new StandardServiceRegistryBuilder().build();catch(Throwable ex)/异常处理 /*全局静态访问方法 */public static SessionFactory getSes
8、sionFactory()return sessionFactory;原型(Prototype)模式 原型(原型(Prototype)是指通过复制自己达到构)是指通过复制自己达到构造目标对象新实例的对造目标对象新实例的对象象 使用原型设计模式的场景有 当一个类的实例状态只能是不同组合中的一种时,而不想通过平行类或子类的方式区分不同的状态组合 当业务代码中不能静态引用目标类的构造器来创建新的目标类的实例 当目标类实例化代价昂贵,不同的客户端需要单独使用一个目标类的对象时原型模式类结构使用原型的练习 COS的通知子系统负责发送多种类型的通知,如,订单通知、系统通知、会员通知等。不同种类通知,会有不
9、同的标题、内容和尾注。同一种类的通知,又有不同的子类型通知,子类型通知标题、内容等不同,尾注、背景等相同;如,订单通知分成不同订单状态(订单已生成,订单已支付等)的子类型通知,系统通知分成不同消息级别(紧急,普通等)的子类型通知。如果为每个的通知类型或子类型单独设计一个类或子类,设计类的数量将会急剧增加原型Notification的类结构public class Notification implements Cloneable private String title;/通知标题private String content;/通知内容private NotificationFooter fo
10、oter;/通知尾注 /*setters,getters方法省略 */Notification(NotificationFooter foo)footer=foo;/*克隆Notification对象(浅拷贝-shallow copy,共享footer)*/Overridepublic Notification clone()try return(Notification)super.clone();catch(CloneNotSupportedException e)/异常处理e.printStackTrace();return null;public class NotificationP
11、rotoManager private static HashMap manager=n e w H a s h M a p();/原型管理器static/初始化订单通知的尾注对象N o t i f i c a t i o n F o o t e r o r d e r F o o t e r =n e w NotificationFooter();/订单通知原型构造manager.put(order,new Notification(orderFooter);/其他原型构造 /*根据通知类型获取原型对象 */public static Notification getNotification
12、Proto(String type)return manager.get(type);public class NotificationSender/存储通知的发送队列 private Queue sendQueue=new LinkedBlockingQueue();/*通过通知原型对象复制,完成新通知对象创建*/public void sendNotification(String title,String content ,Employee receiver,String type)Notification notification=NotificationProtoManager.ge
13、tNotificationProto.clone();/生成新通知对象notification.setContent(content);/设置通知内容notification.setTitle(title);/设置通知标题 notification.setReceiver(receiver);/设置通知接收者 send(notification);/发送通知/*发送通知*/private void send(Notification noti)sendQueue.add(noti);/其他操作使用原型模式时需要注意的问题 对象拷贝在不同的编程语言中有深度拷贝对象拷贝在不同的编程语言中有深度拷贝
14、(Deep Copy,也翻译成深度复制、深拷贝,也翻译成深度复制、深拷贝等)和浅拷贝(等)和浅拷贝(Shallow Copy,也翻译成影,也翻译成影子拷贝、影子复制、浅度复制、浅复制等)子拷贝、影子复制、浅度复制、浅复制等)的区的区别别 如果原型类之间有循环引用的作用域,则如果原型类之间有循环引用的作用域,则无法实现深度拷贝无法实现深度拷贝使用原型模式的行业案例1 JDK的Vector原型类 JDK中使用了大量的原型类 java.util.Vector是一个动态数组 java.util.Vector实现java.lang.Cloneable接口,并重写clone()方法java.util.Ve
15、ctor的类图 public class Vector extends AbstractListimplements List,RandomAccess,Cloneable,java.io.Serializable/*对象拷贝方法 */public synchronized Object clone()try SuppressWarnings(unchecked)Vector v=(Vector)super.clone();/使用Object的clone()方法 /*手动实现元素拷贝 *如果Vector对象元素不是引用类型数据,则为深度拷贝 *否则,为浅拷贝 */v.elementData=A
16、rrays.copyOf(elementData,elementCount);v.modCount=0;return v;catch(CloneNotSupportedException e)/异常处理 /省略的代码 使用原型模式的行业案例1 JDK的HttpCookie原型类 .HttpCookie是一个使用Object的clone()方法实现浅拷贝的原型类 .HttpCookie负责构造HTTP协议的Cookie,常被用于创建有状态的会话(Session)public final class HttpCookie implements Cloneable /*实现浅拷贝 */Overrid
17、e public Object clone()try return super.clone();/使用Object的clone()方法 catch(CloneNotSupportedException e)throw new RuntimeException(e.getMessage();/其他代码 构造器(Builder)模式 构造器(Builder)是指为构造一个复杂的产品对象,进行产品组成元素构建和产品组装的对象 使用构造器的场景有 需要将复杂产品对象的构造过程(或算法)封装在独立的代码中 对不同的产品表示复用同一个构造过程(或算法)构造器模式类结构构造器模式对象协作时序使用构造器的练习
18、 COS菜单数据存储在MySQL数据库表中,服务器程序通过网络向不同的客户端提供菜单数据;浏览器客户端需要的菜单数据文本格式为XML,Android和iOS客户端需要的菜单数据文本格式为JSON 由于COS菜单数据表结构不变,结构化的菜单数据转换为XML或JSON文本的过程或算法相同 XML与JSON是不同的文本对象表示使用构造器构造文本对象的类结构 public interface TextBuilder/*将菜单项类型转换为文本*/public void convertmType(int mType);/*将菜单项名称转换为文本*/public void convertmName(Stri
19、ng mName);/*将菜单项价格转换为文本 */public void convertmPrice(float mPrice);public class JSONBuilder implements TextBuilder private JSONText json;/json文本对象private String jsonElement;/json元素public JSONBuilder()json=new JSONText();/*获取构造好的JSON文本对象*/public JSONText getJsonText()return json;Overridepublic void co
20、nvertmType(int mType)jsonElement=nMType:+mType+;jsonElement+=,;Overridepublic void convertmName(String mName)jsonElement+=MName:+mName+;jsonElement+=,;/省略的代码 public class BuilderDirector private TextBuilder builder;/构造器/*调用构造器,构造目标文本对象的组合元素*/public void construct(List data)/构造算法 for(MenuItem mi:data
展开阅读全文