实验2 (简单)工厂模式
《设计模式》刘伟 实验参考答案

《设计模式》刘伟 实验参考答案实验 11.在某图形库 API 中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:在该图形库中,每个图形类(如 Circle 、Triangle 等)的 init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize() 方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;② 在图形库中增加并使用新的图形时需要修改客户类源代码;③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:① 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;② 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
参考答案: Ci rcle + + + + +in it () setColor () f ill setSize () displa y () void void void void void Trian gle + + + + +in it () setColor () f ill setSize () displa y () void void void void void Rectangl e + + + + +in it () setColor () f ill setSize () displa y () void void void void void Cl ient2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形 (Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个 UnsupportedShapeException 异常,绘制类图并编程模拟实现。
Simtrade实训报告

实训报告实训时间:2011年11月21日~12月30日实训地点:实验楼商务实训室实训软件:Simtrade外贸实习平台指导老师:闫老师班级:09涉外商务管理X班姓名:张XX 学号:2009XXXXXXXX 联系电话:150XXXXXXXX目录一、实训目的 (1)二、Simtrade基本操作模式 (1)1. 出口商模式 (1)2. 进口商模式 (2)3. 工厂模式 (2)4. 银行模式 (2)三、在Simtrade操作中遇到的问题以及解决方式 (3)1. 预算表的填制 (3)2. 单据的填写 (3)3. 邮件的处理 (3)4. 发布广告信息 (3)四、实训中的收获 (4)1. 基本了解国际贸易的流程 (4)2. 初步熟悉预算表的填制 (4)3. 掌握单据的基本填写 (4)4. 从获利中感受商业气氛 (4)五、实训总结 (5)六、实训成绩 (5)Simtrade实训报告一、实训目的simtrade软件融合了国际经济学、电子商务理论和外贸实务流程,很好地模拟了当今国际商务的真实环境。
在这个虚拟贸易平台中,我们按照实训计划同时扮演五个进出口业务流程中的不可或缺的重要角色,从而组成一个虚拟的贸易实务环境。
我们在几个项目中同时轮流扮演出口商、进口商、工厂、出口地银行、进口地银行这五个角色。
从中理解到国际贸易中既存在有着相互竞争也有协作的过程。
通过模拟实训,我们从而熟练掌握各种业务技巧,体会到出口商与工厂和进口商之间、银行和政府机构的互动关系,尤其是在每一单业务下来我们必须缴税,这是一个相当真实的体现。
在simtrade中,提供了L/C、D/P、D/A、T/T四种结算方式,再加上采用不同的贸易术语,如CIF、CFR、FOB等,实际贸易中可采用的贸易和结汇方式就多种多样了。
而在不同方式下,出口商的权利义务又是不一样的,这个是我们要注意的问题。
无论以后我们会不会从事这方面的业务,在实际工作中,我们务必遵守法律的规章制度,真正了解到国际贸易的物流、资金流和业务流的运作方式。
设计模式实验报告总结(3篇)

第1篇一、实验背景随着软件工程的不断发展,设计模式作为一种解决软件开发中常见问题的有效方法,越来越受到广泛关注。
本次实验旨在通过学习设计模式,提高编程能力,掌握解决实际问题的方法,并加深对设计模式的理解。
二、实验目的1. 理解设计模式的基本概念和分类;2. 掌握常见设计模式的原理和应用;3. 提高编程能力,学会运用设计模式解决实际问题;4. 培养团队协作精神,提高项目开发效率。
三、实验内容本次实验主要涉及以下设计模式:1. 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式;2. 结构型模式:适配器模式、装饰者模式、桥接模式、组合模式、外观模式;3. 行为型模式:策略模式、模板方法模式、观察者模式、责任链模式、命令模式。
四、实验过程1. 阅读相关资料,了解设计模式的基本概念和分类;2. 分析每种设计模式的原理和应用场景;3. 编写代码实现常见设计模式,并进行分析比较;4. 将设计模式应用于实际项目中,解决实际问题;5. 总结实验经验,撰写实验报告。
五、实验结果与分析1. 创建型模式(1)单例模式:通过控制对象的实例化,确保一个类只有一个实例,并提供一个访问它的全局访问点。
实验中,我们实现了单例模式,成功避免了资源浪费和同步问题。
(2)工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
实验中,我们使用工厂模式创建不同类型的交通工具,提高了代码的可扩展性和可维护性。
(3)抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
实验中,我们使用抽象工厂模式创建不同类型的计算机,实现了代码的复用和扩展。
(4)建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实验中,我们使用建造者模式构建不同配置的房屋,提高了代码的可读性和可维护性。
2. 结构型模式(1)适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作。
软件设计——简单工厂模式之女娲造人

软件设计——简单⼯⼚模式之⼥娲造⼈⼀、简单⼯⼚模式含义简单⼯⼚模式⼜叫静态⽅法模式(因为⼯⼚类定义了⼀个静态⽅法)现实⽣活中,⼯⼚是负责⽣产产品的;同样在设计模式中,简单⼯⼚模式我们可以理解为负责⽣产对象的⼀个类,称为“⼯⼚类”⼆、解决的问题将“类实例化的操作”与“使⽤对象的操作”分开,让使⽤者不⽤知道具体参数就可以实例化出所需要的“产品”类,从⽽避免了在客户端代码中显式指定,实现了解耦。
即使⽤者可直接消费产品⽽不需要知道其⽣产的细节三、模式原理3.1 模式组成3.2 UML类图3.3 使⽤步骤创建抽象产品类 & 定义具体产品的公共接⼝;创建具体产品类(继承抽象产品类) & 定义⽣产的具体产品;创建⼯⼚类,通过创建静态⽅法根据传⼊不同参数从⽽创建不同具体产品类的实例;外界通过调⽤⼯⼚类的静态⽅法,传⼊不同参数从⽽创建不同具体产品类的实例四、具体实例[实验任务⼀]:⼥娲造⼈实验要求:使⽤简单⼯⼚模式模拟⼥娲(Nvwa)造⼈(Person),如果传⼊参数M,则返回⼀个Man对象,如果传⼊参数W,则返回⼀个Woman对象,如果传⼊参数R,则返回⼀个Robot对象。
请⽤程序设计实现上述场景。
4.1 UML类图接⼝和类的区别:从定义上看,接⼝是个集合,并不是类。
类描述了属性和⽅法,⽽接⼝只包含⽅法(未实现的⽅法)。
接⼝和抽象类⼀样不能被实例化,因为不是类。
但是接⼝可以被实现(使⽤implements 关键字)。
4.2 代码Person . javapackage test2;public interface Person {public void make();}创建接⼝:File ---------> new --------> interfaceMan . javapackage test2;public class Man implements Person{public Man() {}public void make(){System.out.print("⽣产男⼈");}}Woman . javapackage test2;public class Woman implements Person{ public Woman() {}public void make() {System.out.print("⽣产⼥⼈");}}Robot . javapackage test2;public class Robot implements Person{public Robot() {}public void make(){System.out.print("⽣产机器⼈");}}Nvwa . javapackage test2;public class Nvwa {public Nvwa() {}public static Person Personjudge(String arg ) { //判断参数,再选择调⽤哪个类if(arg.equalsIgnoreCase("M")){return new Man();}else if(arg.equalsIgnoreCase("W")){return new Woman();}else if(arg.equalsIgnoreCase("R")){return new Robot();}else{return null;}}}test . javapackage test2;import java.util.Scanner;public class test {public static void main(String[] args) {// TODO Auto-generated method stubScanner scan = new Scanner(System.in);System.out.print("请输⼊参数:");String s = scan.nextLine();try{Person p = Nvwa.Personjudge(s);p.make();}catch(Exception e){System.out.println(e.getMessage());}scan.close();}}4.3 运⾏截图。
南华大学软件设计模式实验

南华大学计算机科学与技术学院软件体系结构与设计模式作业(2016秋季学期)学号:***********班级:软件工程1班*名:***任课老师:蒋良卫作业内容:创建型设计模式日期:2016 年11 月6 日1 简单工厂模式1.1 作业题目使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W。
则返回一个对象Woman,用java语言实现该场景。
现在需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。
(1)绘制简单工厂模式结构视图;(2)请绘制该实例类图,并代码实现。
1.2 所用模式结构视图1.3 实例类图1.4 实例实现代码公共类:lrz0101Personpackage com.bluesky;public class lrz0101Person {public void play(){System.out.println("我还是一坨泥巴,女娲还没有构造我!");}}简单工厂类:lrz0101NvWapackage com.bluesky;public class lrz0101NvWa {public lrz0101Person madeMan(String s){lrz0101Person person = null;switch(s){case"M":person = new lrz0101Man();break;case"W":person = new lrz0101Woman();break;case"R":person = new lrz0101Robot();break;default:System.out.println("Sorry,女娲暂时没有造这种人的能力");person=new lrz0101Person();}return person;}}子类1:lrz0101Manpackage com.bluesky;public class lrz0101Man extends lrz0101Person{ public void play(){System.out.println("大家好,我是男人!我来自地球!");}}子类2:lrz0101Womanpackage com.bluesky;public class lrz0101Woman extends lrz0101Person{ public void play(){System.out.println("大家好,我是女人!我来自水星!");}}子类2:lrz0101Robotpackage com.bluesky;public class lrz0101Robot extends lrz0101Person{ public void play(){System.out.println("大家好,我是机器人!我来未知星球!");}}1.5 运行结果2 工厂模式2.1 作业题目现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器ImgReader,如gif图片读取器GifReader用于读取gif格式的图片,jpg图片读取器JPGReader用于读取jpg格式的图片。
设计模式(简单工厂,工厂方法,抽象工厂)区别

第一种表述简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。
其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。
本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。
简单工厂简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
工厂方法工厂方法是针对每一种产品提供一个工厂类。
通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
抽象工厂抽象工厂是应对产品族概念的。
比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
小结★工厂模式中,重要的是工厂类,而不是产品类。
产品类可以是多种形式,多层继承或者是单个类都是可以的。
但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别简单工厂:用来生产同一等级结构中的任意产品。
(对于增加新的产品,无能为力)工厂模式:用来生产同一等级结构中的固定产品。
(支持增加任意产品)抽象工厂:用来生产不同产品族的全部产品。
(对于增加新的产品,无能为力;支持增加产品族)以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。
所以要根据情况考虑应该使用哪种方法。
第二种表述简单工厂、工厂方法和抽象工厂都是创建型的设计模式。
三者的共同点是:1、都有两种作用不同的类:产品类和工厂类。
其中,工厂类在自己的方法中实例化产品类(即使用new命令生成产品类的对象),并将生成的产品类的对象提供给外部使用。
2、创建的过程,都是类似的:工厂类得到一个标志(可以由程序输入,也可以读取配置文件中的内容),返回一个产品对象。
工厂模式实验报告

工厂模式实验报告工厂模式实验报告引言:工厂模式是一种软件设计模式,它提供了一种创建对象的方法,将对象的实例化过程与客户端代码分离,从而提高了代码的可维护性和可扩展性。
在本次实验中,我们将探索工厂模式在实际开发中的应用,并通过实例化汽车工厂的场景来说明其优点和使用方法。
一、工厂模式的背景和概念工厂模式是一种创建型设计模式,它旨在通过一个工厂类来创建对象,而不是直接在客户端代码中进行实例化。
这种方式将对象的创建过程封装在工厂类中,使得客户端代码与具体对象的创建过程解耦,从而提高了代码的灵活性和可维护性。
二、工厂模式的优点1. 代码解耦:工厂模式将对象的创建过程与客户端代码分离,使得客户端代码只需要关注对象的使用,而不需要关心对象的创建细节。
这样可以降低代码的耦合度,提高代码的可维护性和可扩展性。
2. 简化客户端代码:通过工厂模式,客户端代码只需要与工厂类进行交互,而不需要直接与具体的产品类进行交互。
这样可以简化客户端代码,提高代码的可读性和可理解性。
3. 代码复用:工厂模式可以通过一个工厂类创建多个不同类型的对象,从而实现代码的复用。
当需要创建新的对象时,只需要扩展工厂类,而不需要修改客户端代码。
4. 可扩展性:通过工厂模式,可以方便地添加新的产品类,而不需要修改客户端代码。
这样可以提高系统的可扩展性,满足不断变化的需求。
三、工厂模式的实际应用在实际开发中,工厂模式经常被用于创建复杂对象或者对象的组合。
下面以汽车工厂为例,来说明工厂模式的使用方法。
1. 定义产品接口:首先,我们需要定义一个产品接口,用于描述汽车的基本功能和属性,例如加速、刹车等。
2. 创建具体产品类:然后,我们需要创建具体的产品类,实现产品接口,并实现具体的功能和属性。
例如,创建小轿车类、SUV类等。
3. 创建工厂类:接下来,我们需要创建一个工厂类,用于创建产品对象。
工厂类可以根据客户端的需求,创建不同类型的产品对象。
例如,根据客户端传入的参数,工厂类可以创建小轿车对象或者SUV对象。
设计模式实验报告-工厂模式

实验二:工厂模式实验内容简单工厂方法模式:利用简单工厂方法模式创建pad, phone, watch的对象,并使用这些对象娱乐。
工厂模式:利用工厂模式创建pad, phone, watch的对象,并使用这些对象娱乐。
抽象工厂模式:利用抽象工厂模式创建华为、小米、苹果的pad, phone, watch的对象,并使用这些对象娱乐。
简单工厂方法模式设计图1简单工厂模式类图核心代码ConsumerElectronics.java核心代码Pad.java核心代码Watch.java核心代码Phone.java核心代码ConsumerElectronicsFactory.java核心代码实现效果图 2 简单工厂模式实现效果图工厂模式设计图 3 工厂模式类图核心代码ConsumerElectronicsFactory.java核心代码PadFactory.java核心代码WatchFactory.java核心代码PhoneFactory.java核心代码实现效果图4 工厂模式实现效果图抽象工厂模式设计图5抽象工厂模式类图核心代码AbstractFactory.java核心代码AppleFactory.java核心代码HuaweiFactory.java核心代码MiFactory.java核心代码实现效果图 6 抽象工厂模式实现效果图实验体会做完这次试验,下面是我的一些体会:首先,工厂模式是为了解耦:把对象的创建和使用的过程分开。
其次,工厂模式可以降低代码重复。
如果创建对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
我们可以这些创建对象的代码放到工厂里统一管理。
既减少了重复代码,也方便以后对该对象的创建过程的修改维护。
由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要逐个修正,只需要在工厂里修改即可,降低维护成本。
另外,因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return result;
}
}
// -运算类
class Sub extends Operat {
public double getResult() {
double result = 0;
result = getA() - getB();
return result;
public double getResult() {
double result = 0;
result = getA() / getB();
return result;
}
}
//工厂类
class Factory {
public static Operat oper =null;
public static Operat createOperat(char op) {
public static void main(String[] args) throws IOException {
OperateFactory factory;
Operat oper;
System.out.println("*******工厂模式计算器*******");
Scanner s = new Scanner(System.in);
public double getResult() {
double result = 0;
result = getA() + getB();
return result;
}
}
//具体产品
class Sub extends Operat {
public double getResult() {
double result = 0;
import java.util.Scanner;
abstract class Operat {
private double a, b;
public double getA() {
return a;
}
public void setA(double a) {
this.a = a;
}
public double getB() {
(二)实验内容
分别使用简单工厂模式、工厂模式设计一个简单的计算器,使设计遵循面对对象设计原则,实现代码重用。有无窗体界面均可,至少能够实现加、减运算。
四.实验结果
1.简单工厂模式代码及运行结果(截图)
package com.JFactory.www;
import java.io.IOException;
public Operat creatOperat(){
return new Add();
}
}
//具体工厂
class SubFactory extends OperateFactory{
public Operat creatOperat(){
return new Sub();
}
}
//主函数
class Calc {
System.out.println("输入第一个运算值");
double a = s.nextDouble();
System.out.println("输入运算符号");
char op = s.next().charAt(0);
System.out.println("输入第二个运算值");
double b = s.nextDouble();
switch(op)
{
case '+':
oper=new Add();
break;
case '-':
oper=new Sub();
break;
case '*':
oper=new Mul();
break;
case '/':
oper=new Div();
break;
}
return oper;
}
}
class Calc {
import java.io.IOException;
import java.util.Scanner;
//抽象产品
abstract class Operat {
private double a, b;
public double getA() {
return a;
}
public void setA(double a) {
result = getA() - getB();
return result;
}
}
//抽象工厂
abstract class OperateFactory{
abstract Operat creatOperat();
}
//具体工厂
class AddFactory extends OperateFactory{
}
}
// *运算类
class Mul extends Operat {
public double getResult() {
double result = 0;
result = getA() * getB();
return result;
}
}
// /运算类
class Div extends Operat {
}
else if(op == '-'){
factory = new SubFactory();
oper = factory.creatOperat();
oper.setA(a);
oper.setB(b);
double r = oper.getResult();
System.out.println(oper.getA()+""+op+""+oper.getB()+"="+r);
double a =s.nextDouble();
System.out.println("运算符");
char op = s.next().charAt(0);
System.out.println("第二个运算数据");
double b = s.nextDouble();
oper=Factory. createOperat(op);
实验报告
系别
班级
学号
姓名
时间
地点
2016406
课程名称
设计模式
实验名称
简单工厂、工厂模式
实验过程
一.实验目的与要求
1、熟练使用简单工厂模式解决实际问题
2、熟练使用工厂方法模式解决实际问题
二.实验设备
1、微型计算机
2、编程语言开发平台
三.实验原理和实验内容
(一)实验原理:
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
this.a = a;
}
public double getB() {
return b;
}
public void setB(double b) {
this.b = b;
}
abstract public double getResult();
}
//具体产品
class Add extends Operat {
if(op == '+'){
factory = new AddFactory();
oper = factory.creatOperat();
oper.setA(a);
oper.setB(b);
double r = oper.getResult();
System.out.println(oper.getA()+""+op+""+oper.getB()+"="+r);
}
else{
System.out.println("输入错误");
}s.close();
}
}
工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的哪一个具体产品类。
public static void main(String[] args) throws IOException {
Operat oper;
Scanner s = new Scanner(System.in);
System.out.println("*简单工厂模式计算器*");
System.out.println("第一个运算数据");
return b;
}
public void setB(double b) {
this.b = b;
}
abstract public double getResult();