软件开发生命周期及建模实验报告单例模式工厂模式.docx
- 文档编号:28017748
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:14
- 大小:166.95KB
软件开发生命周期及建模实验报告单例模式工厂模式.docx
《软件开发生命周期及建模实验报告单例模式工厂模式.docx》由会员分享,可在线阅读,更多相关《软件开发生命周期及建模实验报告单例模式工厂模式.docx(14页珍藏版)》请在冰豆网上搜索。
软件开发生命周期及建模实验报告单例模式工厂模式
附:
实验报告格式
信息与管理科学学院计算机科学系
实验报告
课程名称:
软件开发生命周期与建模
实验名称:
【实验1】工厂方法模式(日志记录器)
姓名:
杨现阳,张泽浩,张金庚,张俊超,杨波,王秋波
组号:
3班级:
14级计应四班
指导教师:
张浩
实验室:
兰亭机房2
日期:
2016年05月18日
一、实验目的
工厂方法模式(FactoryMethodPattern)又称为工厂模式,也叫虚拟构造器(VirtualConstructor)模式或者多态工厂(PolymorphicFactory)模式,它属于类创建型模式。
通过工厂方法模式中,工厂父类负责定义创建产品对象的公共接口、工厂子类负责生成具体的产品对象,使得产品类的实例化操作延迟到工厂子类中完成。
通过工厂方法模式实验,理解掌握工厂方法模式是如何超越简单工厂模式、如何符合“开闭原则”,使得系统具有更强的扩展性和可维护性。
二、实验环境
一台PC机,所需软件Win7/10、UML工具(Rose/Visio/EclipseUML/StartUML/)、Eclipse/MyEclipse、JDK6.0等。
三、实验内容
日志记录器系统:
某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等,且用户可以根据要求动态选择日志记录方式,现使用工厂方法模式设计该系统。
四、实验操作过程
1.分析得出日志记录器系统的具体工厂类和具体产品类
工厂:
日志记录器工厂
publicclassDatabaseLogFactoryextendsLogFactory{
publicLogcreateLog(){
returnnewDatabaseLog();
}
}
publicclassFileLogFactoryextendsLogFactory{
publicLogcreateLog(){
returnnewFileLog();
}
}
产品:
日志记录方式
importjavax.swing.JOptionPane;
publicclassFileLogextendsLog{
publicvoidwriteLog(){
JOptionPane.showMessageDialog(null,"文件记录方式!
","14计应四班第三组杨现阳,张金庚,张俊超,张泽浩,杨波,王秋波",1);
}
}
importjavax.swing.JOptionPane;
publicclassDatabaseLogextendsLog{
publicvoidwriteLog(){
JOptionPane.showMessageDialog(null,"数据库记录方式!
","14计应四班第三组杨现阳,张金庚,张俊超,张泽浩,杨波,王秋波",1);
}
}
2.分别对日志记录器系统的产品类和工厂类进行抽象
抽象工厂:
LogFactory
publicabstractclassLogFactory{
publicabstractLogcreateLog();
}
抽象产品:
Log
publicabstractclassLog{
publicabstractvoidwriteLog();
}
3.画出日志记录器系统的工厂类的结构图
4.画出日志记录器系统的产品类的结构图
5.对日志记录器系统的工厂类和产品类进行关联,画出日志记录器系统总体类图
6.总结抽象出一般的工厂方法模式类结构图,并进行角色说明
AbstractFactory为抽象工厂,ConcreteFactory1为具体工厂1,ConcreteFactory2为具体工厂2。
AbstractProduct为抽象产品,ConcreteProduct1为具体产品1,ConcreteProduct2为具体产品2。
五、核心代码与实验结果
核心代码:
importjavax.swing.JOptionPane;
publicclassClient{
publicstaticvoidmain(String[]args){
Loglog;
LogFactorylogf;
Stringtvfname=JOptionPane.showInputDialog("子工厂类名");
try{
Classc=Class.forName(tvfname);
logf=(LogFactory)c.newInstance();
log=logf.createLog();
log.writeLog();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(InstantiationExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
}
}
实验结果:
六、心得体会
问题基本解决,在软件设计中经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
如果我们使用简单工厂,这样会不断地修改工厂类,应对业务变化,违反开闭原则,另外因为实例化产品的判断逻辑在工厂类中,工厂类会变的越来与臃肿。
工厂方法模式又称为工厂模式,也叫虚拟构造器(VirtualConstructor)模式或者多态工厂模式(PolymorphicFactory),定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。
增加了系统的灵活性和扩展性。
七、组内打分
组号
姓名
学号
班级
作业成绩
(百分制)
3
杨现阳
1410208124
计应四班
90
张泽浩
1410208127
计应四班
90
张金庚
1410208125
计应四班
80
张俊超
1410208126
计应四班
80
杨波
1410208123
计应四班
80
王秋波
1410208122
计应四班
80
八、指导教师评分
成绩:
(百分制)
指导教师:
张浩
信息与管理科学学院计算机科学系
实验报告
课程名称:
软件开发生命周期与建模
实验名称:
【实验2】单例模式(身份证号申请)
姓名:
杨现阳,张泽浩,张金庚,张俊超,杨波,王秋波
组号:
3班级:
14级计应四班
指导教师:
张浩
实验室:
兰亭机房2
日期:
2016年05月18日
一、实验目的
单例模式(SingletonPattern)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。
单例模式的要点有三个:
一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
通过单例模式实验,理解掌握单例模式是如何创建唯一实例、如何判断是唯一实例、如何通过公共接口对外提供单一实例。
二、实验环境
一台PC机,所需软件Win2003/XP、UML工具(Rose/Visio/EclipseUML/StartUML/)、Eclipse/MyEclipse、JDK6.0等。
三、实验内容
身份证号码系统:
在现实生活中,居民身份证号码具有唯一性,同一个人不允许有多个身份证号码,第一次申请身份证时将给居民分配一个身份证号码,如果之后因为遗失等原因补办时,还是使用原来的身份证号码,不会产生新的号码。
现使用单例模式模拟该场景。
四、实验操作过程
1.分析身份证号码系统是如何保证在外部不能进行类的实例化
身份证号码类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化它。
2.分析身份证号码系统是如何在类内部自行创建该实例
身份证号码类中包含一个静态私有被实例化的成员变量instance,以确保只有一个实例被创建。
3.分析身份证号码系统是如何对外部(向整个系统)提供该实例
身份证号码类中包含一个静态公有的工厂方法getInstance(),该工厂方法负责返回实例化的成员变量instance,以确保只有一个实例被创建。
4.画出身份证号码系统的总体类图
代码:
publicclassIdentityCardNo{
privatestaticIdentityCardNoinstance=newIdentityCardNo();
publicStringno;
privateIdentityCardNo(){
}
publicstaticIdentityCardNogetInstance(){
returninstance;
}
publicStringgetNo(){
returnno;
}
publicvoidsetNo(Stringno){
this.no=no;
}
}
5.总结抽象出一般的单例模式类结构图,并进行角色说明
懒汉式:
饿汉式:
instance静态私有被实例化的成员变量
静态公有的工厂方法getInstance()
6.饿汉式单例模式和懒汉式单例模式的比较
饿汉式单例类在自己被加载时就将自己实例化。
单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。
从速度和反应时间角度来讲,则比懒汉式单例类稍好些。
懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费大量时间,这意味着出现多线程同时首次引用此类的机率变得较大,需要通过同步化机制进行控制。
五、核心代码与实验结果
核心代码:
importjavax.swing.JOptionPane;
publicclassTestCardNo{
publicstaticvoidmain(String[]args){
IdentityCardNoicn1,icn2;
icn1=IdentityCardNo.getInstance();
icn1.setNo("69839964334983849234");
JOptionPane.showMessageDialog(null,"icn1Number="+icn1.getNo(),"14计应四班第三组杨现阳,张金庚,张俊超,张泽浩,杨波,王秋波",1);
icn2=IdentityCardNo.getInstance();
JOptionPane.showMessageDialog(null,"icn2Number="+icn2.getNo(),"14计应四班第三组杨现阳,张金庚,张俊超,张泽浩,杨波,王秋波",1);
JOptionPane.showMessageDialog(null,icn1==icn2,"14计应四班第三组杨现阳,张金庚,张俊超,张泽浩,杨波,王秋波",1);
}
}
效果:
六、心得体会
问题基本解决,单例模式可以保证整个系统中一个类只有一个实例,而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源,如果只希望在系统中某个类的对象有且只能存在一个,单例模式是最好的解决方案。
对于某些系统来说,有些类只有一个实例很重要,如最常见的数据库连接配置对象。
它在整个系统中只需要一个就足够了,多了就会产生很多不必要的开销,造成资源浪费。
七、组内打分
组号
姓名
学号
班级
作业成绩
(百分制)
3
杨现阳
1410208124
计应四班
90
张泽浩
1410208127
计应四班
90
张金庚
1410208125
计应四班
80
张俊超
1410208126
计应四班
80
杨波
1410208123
计应四班
80
王秋波
1410208122
计应四班
80
八、指导教师评分
成绩:
(百分制)
指导教师:
张浩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 开发 生命周期 建模 实验 报告 模式 工厂