1099111130设计模式实验报告
- 格式:doc
- 大小:153.00 KB
- 文档页数:16
第1篇一、实验背景随着软件工程的不断发展,设计模式作为一种解决软件开发中常见问题的有效方法,越来越受到广泛关注。
本次实验旨在通过学习设计模式,提高编程能力,掌握解决实际问题的方法,并加深对设计模式的理解。
二、实验目的1. 理解设计模式的基本概念和分类;2. 掌握常见设计模式的原理和应用;3. 提高编程能力,学会运用设计模式解决实际问题;4. 培养团队协作精神,提高项目开发效率。
三、实验内容本次实验主要涉及以下设计模式:1. 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式;2. 结构型模式:适配器模式、装饰者模式、桥接模式、组合模式、外观模式;3. 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式。
四、实验过程1. 阅读相关资料,了解设计模式的基本概念和分类;2. 分析每种设计模式的原理和应用场景;3. 编写代码实现常见设计模式,并进行分析比较;4. 将设计模式应用于实际项目中,解决实际问题;5. 总结实验经验,撰写实验报告。
五、实验结果与分析1. 创建型模式(1)单例模式:通过控制对象的实例化,确保一个类只有一个实例,并提供一个访问它的全局访问点。
实验中,我们实现了单例模式,成功避免了资源浪费和同步问题。
(2)工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
实验中,我们使用工厂模式创建不同类型的交通工具,提高了代码的可扩展性和可维护性。
(3)抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
实验中,我们使用抽象工厂模式创建不同类型的计算机,实现了代码的复用和扩展。
(4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实验中,我们使用建造者模式构建不同配置的房屋,提高了代码的可读性和可维护性。
2. 结构型模式(1)适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
设计模式实验二实验报告书专业班级软件0703学号24姓名吉亚云指导老师刘伟时间2010年4月24日中南大学软件学院实验二设计模式上机实验二一、实验目的使用PowerDesigner和任意一种面向对象编程语言实现几种常用的设计模式,加深对这些模式的理解,包括装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,包括根据实例绘制相应的模式结构图、编写模式实现代码,运行并测试模式实例代码。
三、实验要求1. 正确无误绘制装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式的模式结构图;2. 使用任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,代码运行正确无误。
四、实验步骤1. 使用PowerDesigner绘制装饰模式结构图并用面向对象编程语言实现该模式;2. 使用PowerDesigner绘制外观模式结构图并用面向对象编程语言实现该模式;3. 使用PowerDesigner绘制代理模式结构图并用面向对象编程语言实现该模式;4. 使用PowerDesigner绘制职责链模式结构图并用面向对象编程语言实现该模式;5. 使用PowerDesigner绘制命令模式结构图并用面向对象编程语言实现该模式;6. 使用PowerDesigner绘制迭代器模式结构图并用面向对象编程语言实现该模式;7. 使用PowerDesigner绘制观察者模式结构图并用面向对象编程语言实现该模式;8. 使用PowerDesigner绘制状态模式结构图并用面向对象编程语言实现该模式;9. 使用PowerDesigner绘制策略模式结构图并用面向对象编程语言实现该模式;10. 使用PowerDesigner绘制模板方法模式结构图并用面向对象编程语言实现该模式。
实验一单例模式的应用1 实验目的1) 掌握单例模式(Singleton)的特点2) 分析具体问题,使用单例模式进行设计。
2 实验内容和要求很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。
通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容的对象。
如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。
事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。
那么应该怎么实现呢?用C#控制台应用程序实现该单例模式。
绘制该模式的UML图。
3 模式结构图4 UML类图5 代码6运行结果实验二工厂模式的应用1 实验目的1) 掌握工厂模式(Factory)的特点2) 分析具体问题,使用工厂模式进行设计。
2 实验内容和要求有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。
利用工厂模式改善设计,用C#控制台应用程序实现该OEM制造商的工厂模式。
绘制该模式的UML图。
3 模式结构图4 UML类图5 代码6运行结果实验三抽象工厂模式的应用1 实验目的1) 掌握抽象工厂模式(Abstract Factory)的特点2) 分析具体问题,使用抽象工厂模式进行设计。
2 实验内容和要求麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cola),用C#控制台应用程序实现这两个快餐店经营产品的抽象工厂模式。
绘制该模式的UML图。
3 模式结构图4 UML类图5代码6运行结果df实验四建造者模式的应用1 实验目的1) 掌握建造者模式(Builder)的特点2) 分析具体问题,使用建造者模式进行设计。
2 实验内容和要求建造者模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。
设计模式实验二实验报告书专业班级软件 0703 学号 ********** 姓名吉亚云指导老师刘伟时间 2010年4月 24日中南大学软件学院实验二设计模式上机实验二一、实验目的使用PowerDesigner和任意一种面向对象编程语言实现几种常用的设计模式,加深对这些模式的理解,包括装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式。
二、实验内容使用PowerDesigner和任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,包括根据实例绘制相应的模式结构图、编写模式实现代码,运行并测试模式实例代码。
三、实验要求1. 正确无误绘制装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式的模式结构图;2. 使用任意一种面向对象编程语言实现装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式和模板方法模式,代码运行正确无误。
四、实验步骤1. 使用PowerDesigner绘制装饰模式结构图并用面向对象编程语言实现该模式;2. 使用PowerDesigner绘制外观模式结构图并用面向对象编程语言实现该模式;3. 使用PowerDesigner绘制代理模式结构图并用面向对象编程语言实现该模式;4. 使用PowerDesigner绘制职责链模式结构图并用面向对象编程语言实现该模式;5. 使用PowerDesigner绘制命令模式结构图并用面向对象编程语言实现该模式;6. 使用PowerDesigner绘制迭代器模式结构图并用面向对象编程语言实现该模式;7. 使用PowerDesigner绘制观察者模式结构图并用面向对象编程语言实现该模式;8. 使用PowerDesigner绘制状态模式结构图并用面向对象编程语言实现该模式;9. 使用PowerDesigner绘制策略模式结构图并用面向对象编程语言实现该模式;10. 使用PowerDesigner绘制模板方法模式结构图并用面向对象编程语言实现该模式。
实验1 UML实验(1)实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的1.学会安装和使用建模工具Po werDesi gner,熟练使用PowerDesi gner绘制常用的UML图形,熟悉常用的UM L符号;2.构建用例模型来描述软件需求,包括绘制用例图,撰写用例文档并制作用例检查矩阵;3. 绘制状态图描述对象的状态及转换。
二、实验内容1. 某酒店订房系统描述如下:(1) 顾客可以选择在线预订,也可以直接去酒店通过前台服务员预订;(2) 前台服务员可以利用系统直接在前台预订房间;(3) 不管采用哪种预订方式,都需要在预订时支付相应订金;(4) 前台预订可以通过现金或信用卡的形式进行订金支付,但是网上预订只能通过信用卡进行支付;(5) 利用信用卡进行支付时需要和信用卡系统进行通信;(6) 客房部经理可以随时查看客房预订情况和每日收款情况。
绘制该酒店订房系统的用例图。
2. 根据以下场景绘制用例图:某企业为了方便员工用餐,为企业餐厅开发了一个订餐系统(COS:Cafeteri a Orderin g System),企业员工可通过企业内联网使用该系统。
该系统功能描述如下:(1) 企业的任何员工都可以查看菜单和今日特价;(2) 系统的顾客是注册到系统的员工,可以在线订餐(以下操作均需先登录)、注册工资支付、修改订餐信息和删除订餐信息,在注册工资支付时需要通过工资系统进行身份验证;(3) 餐厅员工是特殊的顾客,可以进行备餐(系统记录备餐信息)、生成付费请求和请求送餐,其中对于注册使用工资支付的顾客生成付费请求并发送给工资系统;(4) 菜单管理员是餐厅员工的一种,可以管理菜单;(5) 送餐员也是餐厅员工的一种,可以打印送餐说明、记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。
设计性实验报告设计性实验报告引言:设计性实验是一种通过设计和实施实验来验证或探索某种理论或观点的方法。
本文将介绍一个设计性实验的过程和结果,旨在通过实验来探讨人们对颜色的情绪感知和认知的关系。
实验设计:在这个实验中,我们选择了三种不同的颜色:红色、蓝色和绿色。
我们希望通过观察参与者对这些颜色的情绪反应来了解颜色和情绪之间的关系。
实验过程:1. 参与者选择:我们从大学生群体中随机选择了100名参与者,确保他们没有任何色盲或视觉障碍。
2. 实验环境:实验在一个安静、明亮的实验室中进行,以确保参与者的注意力集中。
3. 实验材料:我们使用了一台计算机和一个显示器来展示颜色。
参与者需要通过按下键盘上的相应按键来表示他们对颜色的情绪反应。
4. 实验步骤:参与者被要求观看屏幕上一系列随机出现的颜色,并根据他们的情绪反应按下相应的按键。
每个颜色的呈现时间为5秒,之间有2秒的间隔。
5. 数据收集:实验结束后,我们收集了参与者的情绪反应数据,并进行了统计分析。
实验结果:通过对参与者的情绪反应数据进行统计分析,我们得出了以下结论:1. 红色:参与者对红色的情绪反应普遍较为积极,表现出愉悦和兴奋的情绪。
2. 蓝色:参与者对蓝色的情绪反应相对较为中性,表现出冷静和平静的情绪。
3. 绿色:参与者对绿色的情绪反应多样,有的表现出愉悦和放松的情绪,有的表现出不安和压抑的情绪。
讨论:我们的实验结果与以往的研究相吻合,即红色通常会引起人们的积极情绪,蓝色则更容易让人保持冷静和平静。
然而,绿色的情绪反应却存在一定的差异。
这可能是因为绿色是一种中间色,同时具有红色和蓝色的特点,因此会引发不同的情绪反应。
结论:通过这个设计性实验,我们验证了颜色与情绪之间的关系。
红色能够引起积极的情绪反应,蓝色则更容易让人保持冷静和平静。
绿色的情绪反应则相对复杂,可能因个体差异而有所不同。
这些发现对于设计领域和情绪研究具有一定的指导意义,可以帮助设计师更好地运用颜色来传达情感和情绪。
设计模式实验报告(一)课程名称: ___设计模式__ _实验名称:__创建型与结构型模式专业: 计算机科学与技术学号:姓名:实验日期:2012.4.09工厂模式一、实验目的:1、学习工厂模式设计2、学习抽象工厂模式设计3、学习建造者模式设计4、学习单例模式二、运行环境:Microsoft Visual Studio 2010三、实验内容1、工厂模式模式定义:在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
实例说明:为了让增加新品牌电视机更加方便,可以通过工厂方法模式对该电视机厂进行进一步重构。
可以将原有的工厂进行分割,为每种品牌的电视机提供一个子工厂,海尔工厂专门负责生产海尔电视机,海信工厂专门负责生产海型电视机,如果需要生产TCL电视机,只需要对应增加一个新的TCL工厂即可,原有的工厂无需做任何修改,使得整个系统具有更好的灵活性和可扩展性。
①源代码:Class1:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;namespace工厂模式?{public interface TV{void play();}public class HaierTV : TV{public void play(){MessageBox.Show("海£尔?电?视酣?播¥放?中D");}}public class HisenseTV : TV{public void play(){MessageBox.Show("海£信?电?视酣?播¥放?中D");}}public interface TVFactory{TV produceTV();}public class HaierTVFactory : TVFactory{public TV produceTV(){MessageBox.Show("海£尔?电?视酣?工¤厂§生Θ?产ú海£信?电?视酣?机ú");return new HaierTV();}}public class HisenseTVFactory : TVFactory{public TV produceTV(){MessageBox.Show("海£信?电?视酣?工¤厂§生Θ?产ú海£信?电?视酣?机ú");return new HisenseTV();}}class Class1{}}Form1.csusing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace工¤厂§模£式?{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e) {TV tv;TVFactory factory;factory = new HaierTVFactory (); //唯¨一?不?一?样ù的?地?方?tv=factory.produceTV ();tv .play ();}private void button2_Click(object sender, EventArgs e) {TV tv;TVFactory factory;factory = new HisenseTVFactory(); //唯¨一?不?一?样ù的?地?方?tv = factory.produceTV();tv.play();}}}②运行结果:主界面:点击“海尔电视”按钮后:再点击“确定”后:点击“海信电视”按钮后:点击“确定”按钮后:2、抽象工厂模式模式定义:提供一个创建一系列相关或相互依赖对象的接口,且无需指定他们具体的类。
实验1 UML实验(1)实验学时: 2每组人数: 1实验类型: 3 (1:基础性2:综合性3:设计性4:研究性)实验要求: 1 (1:必修2:选修3:其它)实验类别: 3 (1:基础2:专业基础3:专业4:其它)一、实验目的1.学会安装和使用建模工具PowerDesigner,熟练使用PowerDesigner绘制常用的UML 图形,熟悉常用的UML符号;2.构建用例模型来描述软件需求,包括绘制用例图,撰写用例文档并制作用例检查矩阵;3. 绘制状态图描述对象的状态及转换。
二、实验内容1. 某酒店订房系统描述如下:(1) 顾客可以选择在线预订,也可以直接去酒店通过前台服务员预订;(2) 前台服务员可以利用系统直接在前台预订房间;(3) 不管采用哪种预订方式,都需要在预订时支付相应订金;(4) 前台预订可以通过现金或信用卡的形式进行订金支付,但是网上预订只能通过信用卡进行支付;(5) 利用信用卡进行支付时需要和信用卡系统进行通信;(6) 客房部经理可以随时查看客房预订情况和每日收款情况。
绘制该酒店订房系统的用例图。
2. 根据以下场景绘制用例图:某企业为了方便员工用餐,为企业餐厅开发了一个订餐系统(COS:Cafeteria Ordering System),企业员工可通过企业内联网使用该系统。
该系统功能描述如下:(1) 企业的任何员工都可以查看菜单和今日特价;(2) 系统的顾客是注册到系统的员工,可以在线订餐(以下操作均需先登录)、注册工资支付、修改订餐信息和删除订餐信息,在注册工资支付时需要通过工资系统进行身份验证;(3) 餐厅员工是特殊的顾客,可以进行备餐(系统记录备餐信息)、生成付费请求和请求送餐,其中对于注册使用工资支付的顾客生成付费请求并发送给工资系统;(4) 菜单管理员是餐厅员工的一种,可以管理菜单;(5) 送餐员也是餐厅员工的一种,可以打印送餐说明、记录送餐信息(如送餐时间)以及记录收费(对于没有注册工资支付的顾客,由送餐员收取现金后记录)。
一、实验背景工厂设计模式是一种常用的创建型设计模式,其主要目的是将对象的创建和使用分离,使得客户端代码无需关心具体对象的创建过程,只需关注对象的接口和使用方法。
通过工厂设计模式,可以降低系统之间的耦合度,提高代码的可扩展性和可维护性。
本次实验旨在通过实现工厂设计模式,加深对设计模式的理解,并掌握其应用方法。
二、实验目的1. 理解工厂设计模式的基本概念和原理。
2. 掌握工厂设计模式的三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。
3. 学会使用工厂设计模式解决实际问题。
三、实验内容1. 简单工厂模式简单工厂模式由一个工厂类负责创建所有产品的实例。
客户端只需传递一个参数,工厂类即可根据参数创建相应的产品实例。
(1)创建产品接口```javapublic interface Product {void operation();}```(2)创建具体产品类```javapublic class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("执行产品A的操作");}}public class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("执行产品B的操作");}}```(3)创建简单工厂类```javapublic class SimpleFactory {public static Product createProduct(String type) { if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}return null;}}```(4)客户端代码```javapublic class Client {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.operation();Product productB = SimpleFactory.createProduct("B");productB.operation();}}```2. 工厂方法模式工厂方法模式在简单工厂模式的基础上增加了一个抽象工厂类,具体工厂类继承自抽象工厂类,并实现具体产品的创建。
实验二 设计模式实验一一、实验目的熟练使用面向对象设计原则对系统进行重构;熟练使用PowerDesigner 和任意一种面向对象编程语言实现几种常见的设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式,并学会分析这些模式的使用效果。
二、实验内容使用面向对象设计原则对系统进行重构;使用PowerDesigner 和任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、适配器模式、桥接模式和组合模式,包括根据实例绘制模式结构图、编写模式实例模拟实现代码,运行并测试所编写代码。
(1) 面向对象设计原则在某图形库API 中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:在该图形库中,每个图形类(如Circle 、Triangle 等)的init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize()方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;② 在图形库中增加并使用新的图形时需要修改客户类源代码;③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复Circle+++++init ()setColor ()fill ()setSize ()display ()...: void : void : void : void : void Triangle +++++init ()setColor ()fill ()setSize ()display ()...: void : void : void : void : void Rectangle+++++init ()setColor ()fill ()setSize ()display ()...: void : void : void : void : void Client杂,导致客户类代码冗长且难以维护。
设计模式实验一实验报告书专业班级软件 0703 学号 3901070324 姓名吉亚云指导老师刘伟时间 2010年3月 27日中南大学软件学院实验一设计模式上机实验一一、实验目的熟练使用PowerDesigner绘制类图,构造系统的静态结构模型;使用PowerDesigner和任意一种面向对象编程语言实现几种常见的设计模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、单例模式、适配器模式、桥接模式和组合模式。
二、实验要求1. 使用PowerDesigner绘制标准的UML类图;2. 正确无误绘制简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、单例模式、适配器模式、桥接模式和组合模式的模式结构图;3. 使用任意一种面向对象编程语言实现简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、单例模式、适配器模式、桥接模式和组合模式,代码运行正确无误。
三、实验步骤1. 熟悉PowerDesigner11的常用功能;2. 使用PowerDesigner绘制类图;3. 使用PowerDesigner绘制简单工厂模式结构图并用面向对象编程语言实现该模式;4. 使用PowerDesigner绘制工厂方法模式结构图并用面向对象编程语言实现该模式;5. 使用PowerDesigner绘制抽象工厂模式结构图并用面向对象编程语言实现该模式;6. 使用PowerDesigner绘制原型模式结构图并用面向对象编程语言实现该模式;7. 使用PowerDesigner绘制单例模式结构图并用面向对象编程语言实现该模式;8. 使用PowerDesigner绘制适配器模式结构图并用面向对象编程语言实现该模式;9. 使用PowerDesigner绘制桥接模式结构图并用面向对象编程语言实现该模式;10. 使用PowerDesigner绘制组合模式结构图并用面向对象编程语言实现该模式。
四、实验报告要求1. 绘制实例场景的类图;2. 提供简单工厂模式结构图及实现代码;3. 提供工厂方法模式结构图及实现代码;4. 提供抽象工厂模式结构图及实现代码;5. 提供原型模式结构图及实现代码;6. 提供单例模式结构图及实现代码;7. 提供适配器模式结构图及实现代码;8. 提供桥接模式结构图及实现代码;9. 提供组合模式结构图及实现代码。
《设计模式》实验指导书软件学院前言随着面向对象技术的发展和广泛的应用,设计模式已成为面向对象开发人员的必备技能之一。
无论是面向对象的初学者还是具有一定开发经验的程序员,都可以通过对设计模式的学习和应用加深对面向对象思想的理解,开发出具有更好的可扩展性和复用性的软件。
本实验指导书通过项目实例让学生加深对设计模式的理解,在学习设计模式的同时掌握如何在实际软件开发中运用模式,强化对设计模式的理解和掌握。
实验一:创建型模式设计一、实验目的1、以本实验指导中给定的实验模式为实验实例,掌握五类“创建型模式”的工作原理和应用环境。
2、掌握工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)等五类“创建型模式”的实验过程。
二、实验原理1、创建型模式的工作原理创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
创建型模式分为:工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)等五类。
2、Factory Method模式的工作原理工厂方法模式(Factory Method Pattern):也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。
它的UML类图如下:工厂方法模式包含如下角色:✓Product:抽象产品✓ConcreteProduct:具体产品✓Creator:抽象工厂✓Concrete Creator:具体工厂Factory Method 模式的特点为当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则”。
蛋糕订购系统一、实验介绍 (3)二、实验环境 (3)三、系统流程 (3)四、系统总类图 (4)五、程序源代码及各个模块子类图 (5)六、程序运行截图 (22)七、实验总结 (22)一、实验介绍本系统使用了简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式、观察者模式一共6种模式实现了从蛋糕店订购订购蛋糕的这样一个系统。
二、实验环境Windows操作系统、MyEclipse10.0、MySQL 5.5、jdk1.6 三、系统流程四、系统总类图五、程序源代码及各个模块子类图(一)测试类Client.java:package net.xsl.ordercake.test;import net.xsl.ordercake.discount.DiscountStyleThree;import net.xsl.ordercake.discount.OrderCake;import net.xsl.ordercake.order.CakeShop;import net.xsl.ordercake.order.EastVilla;import net.xsl.ordercake.order.WestVilla;public class Client {public static void main (String arg[]){CakeShop starCakeShop = CakeShop.getCakeShop();new WestVilla(starCakeShop, "草莓水果");starCakeShop.getNewName("西13");starCakeShop.notifyCustomer();OrderCake cake = new OrderCake();System.out.println("今日促销一律8折优惠");cake.setM(8);cake.setStyle(new DiscountStyleThree());cake.setPrice(80) ;System.out.println("本次订购成功完成,需要支付的金额为"+cake.getMoney(cake.getPrice(),cake.getM())+",原价80");System.out.println("=================================");new EastVilla(starCakeShop, "甜奶");starCakeShop.getNewName("东18");starCakeShop.notifyCustomer();System.out.println("=================================");starCakeShop.getNewName("东12");starCakeShop.notifyCustomer();}}(二)折扣的接口和方法(策略模式):a)接口DiscountStyle.java:package net.xsl.ordercake.discount;public interface DiscountStyle {public double disCount(double price,double m);}b)折方式一DiscountStyleOne.java:package net.xsl.ordercake.discount;public class DiscountStyleOne implements DiscountStyle{public double disCount(double price,double m) {return price;}}c)打折方式二DiscountStyleTwo.java:package net.xsl.ordercake.discount;public class DiscountStyleTwo implements DiscountStyle{public double disCount(double price,double m) {price = price - m;return price;}}d)打着方式三DiscountStyleThree.java:package net.xsl.ordercake.discount;public class DiscountStyleThree implements DiscountStyle{ public double disCount(double price,double m) {price = price * m/10;return price;}}e)订蛋糕对象类,使用了get/set方法OrderCake.java:package net.xsl.ordercake.discount;public class OrderCake {double money,price;//money是打折后的最终价格,price是原价DiscountStyle style;double m;public double getMoney(double price,double m){return style.disCount(price,m);}public void setPrice(double price){this.price = price ;}public double getPrice(){return price;}public void setStyle(DiscountStyle style){this.style = style ;}public DiscountStyle getStyle(){return style;}public void setM(double m){this.m = m ;}public double getM(){return m;}}(三)顾客向蛋糕订购蛋糕(观察者模式),并在具体主题中使用了单例模式a)主题Shop.java:package net.xsl.ordercake.order;public interface Shop {public void addCustomer(Customer o);public void deleteCustomer(Customer o);public void notifyCustomer();}b)具体主题(使用了单例模式,只能创建一个蛋糕商店的对象)CakeShop.java:package net.xsl.ordercake.order;import java.util.ArrayList;public class CakeShop implements Shop{String name;boolean changed;ArrayList<Customer>personList;private int i = 0;private static CakeShop uniqueCakeShop;private CakeShop() {uniqueCakeShop = this;personList = new ArrayList<Customer>();name = "";changed = false;}public static synchronized CakeShop getCakeShop(){if(uniqueCakeShop == null){uniqueCakeShop = new CakeShop();}return uniqueCakeShop;}public void addCustomer(Customer o) {if(!(personList.contains(o)))personList.add(o);}public void deleteCustomer(Customer o) {if((personList.contains(o)))personList.remove(o);}public void notifyCustomer() {if(changed){try{Customer customer = personList.get(i);customer.orderCake(name);i++;changed = false;}catch(Exception e){System.out.println("没有新的订购信息");}}}public void getNewName(String str){if(str.equals(name))changed = false;else{name = str;changed = true;}}}c)观察者Customer.java:package net.xsl.ordercake.order;public interface Customer {public void orderCake(String name);}d)体观察者一EastVilla.java:package net.xsl.ordercake.order;import net.xsl.ordercake.creator.MakeChocolateCake;import net.xsl.ordercake.creator.MakeFruityCake;import net.xsl.ordercake.creator.MakeMilkCake;import net.xsl.ordercake.jdbc.JDBCFacade;import net.xsl.ordercake.product.ChocolateFactory;import net.xsl.ordercake.product.FruitFactory;import kFactory;public class EastVilla implements Customer{Shop shop;private String cakeType;public EastVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}public void orderCake(String name){System.out.println(name+"订了一个"+cakeType+"蛋糕");JDBCFacade dbFacade=new JDBCFacade();String sqlStr = "select * from ordercake";String sqlStr1 = "insert into ordercake(cakeType, name, quantity)"+ " VALUES ('"+cakeType+"','"+name+"','1')";dbFacade.jdbcInsert(sqlStr1);System.out.println("查询插入之后新的数据库");dbFacade.jdbcSelect(sqlStr);if(cakeType.equals("草莓水果") || cakeType.equals("葡萄水果")){MakeFruityCake eastVilla = new MakeFruityCake(cakeType);FruitFactory fruitCake = eastVilla.makeFruityCake();fruitCake.createCake();}else if(cakeType.equals("牛奶巧克力") || cakeType.equals("黑巧克力")){MakeChocolateCake eastVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =eastVilla1.makeChocolateCake();chocolateCake.createCake();}else if(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){MakeMilkCake eastVilla1 = new MakeMilkCake(cakeType);MilkFactory milkCake = eastVilla1.makeMilkCake();milkCake.createCake();}}}e)具体观察者二WestVilla.java:package net.xsl.ordercake.order;import net.xsl.ordercake.creator.MakeChocolateCake;import net.xsl.ordercake.creator.MakeFruityCake;import net.xsl.ordercake.creator.MakeMilkCake;import net.xsl.ordercake.jdbc.JDBCFacade;import net.xsl.ordercake.product.ChocolateFactory;import net.xsl.ordercake.product.FruitFactory;import kFactory;public class WestVilla implements Customer{Shop shop;private String cakeType;public WestVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}public void orderCake(String name){System.out.println(name+"订了一个"+cakeType+"蛋糕");JDBCFacade dbFacade=new JDBCFacade();String sqlStr = "select * from ordercake";String sqlStr1 = "insert into ordercake(cakeType, name, quantity)"+ " VALUES ('"+cakeType+"','"+name+"','1')";dbFacade.jdbcInsert(sqlStr1);System.out.println("查询插入之后新的数据库");dbFacade.jdbcSelect(sqlStr);if(cakeType.equals("草莓水果") || cakeType.equals("葡萄水果")){MakeFruityCake westVilla = new MakeFruityCake(cakeType);FruitFactory fruitCake = westVilla.makeFruityCake();fruitCake.createCake();}else if(cakeType.equals("牛奶巧克力") || cakeType.equals("黑巧克力")){MakeChocolateCake westVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =westVilla1.makeChocolateCake();chocolateCake.createCake();}else if(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){MakeMilkCake westVilla1 = new MakeMilkCake(cakeType);MilkFactory milkCake = westVilla1.makeMilkCake();milkCake.createCake();}}}(四)JDBC(门面模式)JDBCFacade.java:package net.xsl.ordercake.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;public class JDBCFacade {Connection conn = null;Statement stmt = null;ResultSet rs = null;String sqlStr = "";public void createStatement() {try {stmt = conn.createStatement();} catch (SQLException e) {e.printStackTrace();}}public ResultSet jdbcSelect(String sqlStr){this.sqlStr = sqlStr;getConnection();createStatement();try {rs = stmt.executeQuery(sqlStr);ResultSetMetaData rsmd = rs.getMetaData();int j = 0;j = rsmd.getColumnCount();while(rs.next()){for(int i=0;i<j;i++){System.out.print(rs.getString(i+1));System.out.print("\t");}System.out.println();}} catch (SQLException e) {e.printStackTrace();}return rs;}public void jdbcUpdate(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("表更新 " + count + " 条数据");} catch (SQLException e) {System.out.println("更新数据失败");}}public void jdbcInsert(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("向表插入 " + count + " 条数据");} catch (SQLException e) {System.out.println("插入数据失败" + e.getMessage());}}public void jdbcDelete(String sqlStr) {this.sqlStr = sqlStr;getConnection();createStatement();try {int count = stmt.executeUpdate(sqlStr);System.out.println("向表删除 " + count + " 条数据");} catch (SQLException e) {System.out.println("删除数据失败");}}public void jdbcClose(){try {rs.close();stmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}public Connection getConnection() {try {Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/cakeshop","root","admin");} catch (Exception e) {System.out.println("数据库连接失败" + e.getMessage());}return conn;}}(五)构造蛋糕(工厂方法模式):a)构造者MakeCake.java:package net.xsl.ordercake.creator;public interface MakeCake {}b)具体构造者一MakeChocolateCake.java:package net.xsl.ordercake.creator;import net.xsl.ordercake.product.ChocolateFactory;public class MakeChocolateCake implements MakeCake{ private String cakeType;public MakeChocolateCake(String cakeType){this.cakeType = cakeType;}public ChocolateFactory makeChocolateCake(){return new ChocolateFactory(cakeType);}}c)具体构造者二MakeFruityCake.java:package net.xsl.ordercake.creator;import net.xsl.ordercake.product.FruitFactory;public class MakeFruityCake implements MakeCake{ private String cakeType;public MakeFruityCake(String cakeType){this.cakeType = cakeType;}public FruitFactory makeFruityCake(){return new FruitFactory(cakeType);}}d)具体构造者三MakeMilkCake.java:package net.xsl.ordercake.creator;import kFactory;public class MakeMilkCake implements MakeCake{ private String cakeType;public MakeMilkCake(String cakeType){this.cakeType = cakeType;}public MilkFactory makeMilkCake(){return new MilkFactory(cakeType);}}e)抽象产品Factory.java:package net.xsl.ordercake.product;public interface Factory {public void createCake();}f)具体产品一FruitFactory.java:package net.xsl.ordercake.product;public class FruitFactory implements Factory{ private String cakeType;public FruitFactory(String cakeType){this.cakeType = cakeType;}public void createCake(){try{if (cakeType.equals("草莓水果")){FruityCake strawberryCake = new StrawberryCake();strawberryCake.show();}else if (cakeType.equals("葡萄水果")) {FruityCake grapeCake = new GrapeCake();grapeCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}g)具体产品二MilkFactory.java:package net.xsl.ordercake.product;public class MilkFactory implements Factory{private String cakeType;public MilkFactory(String cakeType){this.cakeType = cakeType;}public void createCake(){try{if (cakeType.equals("双层鲜奶")){MilkCake doubleMilkCake = new DoubleMilkCake();doubleMilkCake.show();}else if (cakeType.equals("甜奶")) {MilkCake sweetMilkCake = new SweetMilkCake();sweetMilkCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}h)具体产品三ChocolateFactory.java:package net.xsl.ordercake.product;public class ChocolateFactory {private String cakeType;public ChocolateFactory(String cakeType){this.cakeType = cakeType ;}public void createCake(){try{if (cakeType.equals("牛奶巧克力")){ChocolateCake milkChocolateCake = new MilkChocolateCake();milkChocolateCake.show();}else if (cakeType.equals("黑巧克力")) {ChocolateCake darkChocolateCake = new DarkChocolateCake();darkChocolateCake.show();}}catch (Exception e){System.out.println("制作"+cakeType+"蛋糕失败");}}}(六)蛋糕工厂(简单工厂模式):a)水果蛋糕:i.FruitFactory.java(第五项构造蛋糕中已贴出):ii.接口类FruityCake.java:package net.xsl.ordercake.product;public interface FruityCake {public void show();}iii.实现接口:StrawberryCake.java:package net.xsl.ordercake.product;public class StrawberryCake implements FruityCake{ public void show() {System.out.println("生产了一个草莓水果蛋糕");}}GrapeCake.java:package net.xsl.ordercake.product;public class GrapeCake implements FruityCake{public void show() {System.out.println("生产了一个葡萄水果蛋糕");}}b)牛奶蛋糕:kFactory.java(第五项构造蛋糕中已贴出):ii.接口类MilkCake.java:package net.xsl.ordercake.product;public interface MilkCake {void show();}iii.实现接口:SweetMilkCake.java:package net.xsl.ordercake.product;public class SweetMilkCake implements MilkCake{ public void show() {System.out.println("生产了一个甜奶蛋糕");}}DoubleMilkCake.java:package net.xsl.ordercake.product;public class DoubleMilkCake implements MilkCake{public void show() {System.out.println("生产了一个双层鲜奶蛋糕");}}c)巧克力蛋糕:i.ChocolateFactory.java(第五项构造蛋糕中已贴出):ii.接口类ChocolateCake.javapackage net.xsl.ordercake.product;public interface ChocolateCake {void show();}iii.实现接口:DarkChocolateCake.java:package net.xsl.ordercake.product;public class DarkChocolateCake implements ChocolateCake{public void show() {System.out.println("生产了一个黑巧克力蛋糕");}}MilkChocolateCake.java:package net.xsl.ordercake.product;public class MilkChocolateCake implements ChocolateCake{public void show() {System.out.println("生产了一个牛奶巧克力蛋糕");}}六、程序运行截图七、实验总结本次实验的实现过程中,对有些模式理解还不是很深刻,后来通过翻阅教科书,研究它的示例程序,还有老师的ppt,其中最重要的是它的类图,最终使用了出来,并把它和其他模式结合在一起。
设计模式实验报告一、实验目的通过本次实验,旨在让学生了解并掌握常见的设计模式,在实际场景中使用设计模式来解决软件设计中的复杂问题。
二、实验内容1.理论研究:学生需要深入研究常见的设计模式,包括创建型、结构型和行为型设计模式,并了解每种设计模式的适用场景和解决方案。
2.实践应用:学生需要选择3种不同类型的设计模式进行实践应用,并编写代码来演示每种设计模式的应用。
三、实验过程1.理论研究在理论研究阶段,我选择了单例模式、适配器模式和策略模式进行深入研究。
1.1单例模式单例模式是一种常用的创建型设计模式。
它保证其中一个类只有一个实例,并提供一个全局访问点来访问这个实例。
单例模式适用于需要频繁创建和销毁对象的场合。
1.2适配器模式适配器模式是一种常用的结构型设计模式。
它将一个类的接口转换成客户希望的另一个接口。
适配器模式可以让不兼容的类能够合作,提供一个统一的接口。
1.3策略模式策略模式是一种常用的行为型设计模式。
它定义一系列算法,将它们封装起来,并且使它们可以相互替换,让算法的变化独立于使用算法的客户。
2.实践应用在实践应用阶段,我选择了Java编写代码来演示每种设计模式的应用。
2.1单例模式应用首先,我创建了一个Singleton类,保证该类只有一个实例。
在该类中声明一个私有静态变量instance,并将构造方法设置为私有,防止在外部创建新的实例。
然后,通过一个公有的静态方法来获取该类的实例。
2.2适配器模式应用接下来,我创建了一个MediaPlayer接口,包含了播放音频和视频的两个方法。
然后,我创建了一个AdvancedMusicPlayer类,实现了播放音频的方法。
接着,我创建了一个MediaPlayerAdapter类,实现了MediaPlayer接口,将AdvancedMusicPlayer适配成MediaPlayer的形式。
使用适配器模式可以让调用方可以统一调用MediaPlayer的接口,无需知道具体使用的是AdvancedMusicPlayer。
产品模型设计实验报告一、实验目的本实验旨在通过产品模型设计的实践操作,加深对产品设计原理和方法的理解,提高产品设计能力和团队协作能力。
二、实验过程2.1 产品需求分析首先,我们对选择的产品进行了需求分析。
通过市场调研和用户调研,我们确定了产品的定位、主要功能和用户画像。
2.2 创意思维和脑暴在产品需求分析的基础上,我们进行了创意思维和脑暴的过程,收集了大量的创意和灵感。
然后,我们根据产品的核心功能和用户需求,筛选出一些创意并进行深度挖掘。
2.3 产品原型设计在创意挖掘的基础上,我们开始了产品的原型设计。
我们使用了Axure RP等原型设计工具,通过制作线框图、流程图和交互图等形式,实现了产品的初步设计。
2.4 用户测试和反馈收集我们根据产品的初步设计,进行了用户测试。
通过与用户的交流和观察,收集了用户的反馈意见。
根据这些反馈意见,我们对产品原型进行了优化和修改。
2.5 产品模型制作根据最终确定的产品原型,我们开始了产品模型的制作。
我们使用了3D打印技术、木工工具等相关工具和材料,制作了产品的模型。
三、实验结果经过我们团队的共同努力,我们成功完成了产品模型设计实验。
最终的产品模型与我们最初的设计愿景相符,具备了预期的功能和美观的外观。
四、实验总结本次实验使我们对产品设计的各个环节有了更深入的认识和理解,增强了我们的团队协作能力和解决问题的能力。
通过与用户的互动和反馈,我们逐步改进了产品原型,并最终制作出了满足用户需求的产品模型。
然而,我们还有一些不足之处。
在需求分析和创意挖掘阶段,我们需要更多的市场和用户调研,以更好地理解用户需求和市场趋势。
在产品原型设计和模型制作过程中,我们应更加注重细节和工艺,以提高产品的质量和美观度。
总之,本次实验是一次宝贵的实践机会,我们从中学到了许多知识和经验,也发现了自己的不足之处。
相信通过不断的学习和实践,我们的产品设计能力和团队合作能力会不断提高,为用户创造出更优秀的产品。