设计模式在FileUpload组件中的应用_第1页
设计模式在FileUpload组件中的应用_第2页
设计模式在FileUpload组件中的应用_第3页
设计模式在FileUpload组件中的应用_第4页
设计模式在FileUpload组件中的应用_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计说明书课程设计说明书 课程名称设计模式课程设计 设计题目设计模式在FileUpload组件中的应用 班号专业软件工程 学生姓名###### 指导教师(签字)目录设计模式概述1.1模式与设计模式1.2设计模式的定义1.3设计模式的基本要素1.4设计模式的分类FileUpload组件简介2.1FileUpload组件由来及使用2.2FileUpload组件的工作原理2.3FileUpload组件中的部分接口、类简介设计模式在FileUpload组件中的应用3.1工厂方法模式在FileUpload组件中的应用3.2策略模式在FileUpload组建中的应用3.3迭代器模式在FileUpload组建中的应用3.4FileUpload组件中的重要类图结束语4.1收获与总结4.2参考文献设计模式概述1.1模式与设计模式模式起源于建筑业而非软件业,模式(Pattern)之父—美国加利佛尼亚大学环境结构中心研究所所长ChristopherAlexander博士。Alexander给出了关于模式的经典定义:每个模式都描述了我们环境中不断出现的问题,然后描述了解决这个问题解决方案的核心,通过这种方式,我们可以无数次的重用那些已有的解决方案,无需再重复相同的工作,也可以用一句话概括为:模式是在特定环境中解决问题的一种方案。最早将Alexander博士的模式思想引入软件工程方法学的是以四人组(GangofFour,GoF)自称的四位著名软件工程学者,他们在1949归纳发表的23中在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法学在分析、设计和实现间的鸿沟。GoF将模式的概念引入软件工程领域,标志着软件模式的诞生,软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思想或参照样板软件模式并非仅限于设计模式,还包括架构模式、分析模式、和过程模式等。从1987年KentBeck和WardCunningham借鉴Alexander的模式思想在程序开发中开始应用一些模式到目前设计模式在软件开发的广泛应用,Sun公司的JavaSE/JavaEE平台和Microsoft公司的.net平台设计中就应用了大量的设计模式。再设计模式领域,下一的设计模式是指GoF的《设计模式:可复用面向对象软件的基础》一书中包含的23中经典设计模式,不过设计模式并不仅仅只有这23中,随着软件开发技术的发展,越来越多的模式不断诞生并得以广泛应用。1.2设计模式的定义设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。1.3设计模式的基本要素1.3.1模式名称(Patternname)模式名称通过一两个词来描述模式的问题、解决方案和效果,以便更好地理解模式并方便开发人员之间的交流,绝大多数模式都是根据其功能或模式结构来命名的。 1.3.2问题(Problem)

问题描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因。这些问题有些是一些特定的设计问题,如怎样使用对象封装状态或者使用对象表示算法等,也可能是系统中存在不灵活的类或对象结构,导致系统可维护性较差。1.3.3解决方案(Solution)解决方案描述了设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式。模式是一个通用的模板,它们可以应用于各种不同的场合,解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。1.3.4效果(Consequences)效果描述了模式应用的效果以及在使用模式时应权衡的问题。效果主要包含模式的优缺点分析,我们应该知道,没有任何一个解决方案是百分之百完美的,在使用设计模式时需要进行合理的评价和选择。1.4设计模式的分类根据设计模式的目的(模式是用来做什么的)可分为创建型(creational)、结构型(structural)和行为型(behavioral)三种。以下是GoF的23中经典模式的分类。FileUpload组件简介2.1.FileUpload组件由来及使用FileUpload是Apachecommons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的Smartypants齐名。需要注意的是FileUpload组件在使用时依赖于CommonsIO组件,因此在继续之前,要确保在你的工程classpath中有描述页中提到的相应版本,本次课程实际使用的FileUpload版本为:commons-fileupload-1.3.1,CommonsIO版本为:commons-io-1.4。2.2.FileUpload组件的工作原理上传的文件要求包括一个根据RFC1867(在HTML中基于表单的文件)编码的选项列表清单。组件FileUpload可以解析这个请求,并给你的应用程序提供一份独立上传的项目清单。无论每个项目背后如何执行都实现了FileItem接口。这里将描述组件FileUpload库的普通API,这些API比较简单。不过,对于最终的实现,你可以参考最新的API流。每一个文件项目都有一些属性,这些可能在你的应用程序中应用到。比如:每一个项目有一个名称name和内容类型contenttype,并提供了一个InputStream访问其数据。另一方面,你处理项目的方法可能有所不同,这个依赖于是否这个项目是一个规则的表单域,即:这个数据是来自普通的表单文本,还是普通的HTML域或是一个上传文件。在FileItem接口中提供了处理这些问题的方法,可以更加方便的去访问这些数据。组件FileUpload使用FileItemFactory工厂创建新的文件项目。这个给了组件FileUpload很大的灵活性。这个工厂拥有怎样创建项目的最终控制权。工厂执行过程中上传项目文件的临时数据可以存储在内存中或硬盘上。这个依赖于上传项目的大小(即:数据的字节)。不过这种行为可以在你的应用程序中适当的自定制。2.3FileUpload组件中部分接口、类简介2.3.1FileItem接口mons.fileupload.disk.DiskFileItem实现了FileItem接口,用来封装单个表单字段元素的数据。通过调用FileItem定义的方法可以获得相关表单字段元素的数据。2.3.2FileUpload类FileUpload类的继承结构:java.lang.Omons.fileupload.FileUploadBase mons.fileupload.FileUpload2.3.3DiskFileItemFactory此类将请求消息实体中的每一个项目封装成单独的DiskFileItem(FileItem接口的实现)对象的任务由mons.fileupload.FileItemFactory接口的默认实现mons.fileupload.disk.DiskFileItemFactory来完成。当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。2.3.4ServletFileUpload类mons.fileupload.servlet.ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不需要管底层实现,暴露给用户的简单易用的接口)。使用其parseRequest(HttpServletRequest)方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。第三章设计模式在FileUpload组件中的应用3.1工厂方法模式在FileUpload组件中的应用3.1.1工厂方法模式定义工厂方法模式(FactoryMethodPattern)定义:工厂方法模式又称为工厂模式,也叫虚拟构造器(VirtualConstructor)模式或者多态工厂(PolymorphicFactory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。3.1.2工厂方法模式结构1.Product(抽象产品)

抽象产品是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的共同父类或接口。2.ConcreteProduct(具体产品)具体产品实现了抽象产品接口,某种类型的具体产一一对应。3.Factory(抽象工厂)在抽象工厂类中,声明了工厂方法(FactoryMethod)厂方法模式的核心,它与应用程序无关。任何在模式中创建对象的工厂类都必须实现该接口。4.ConcreteFactory(具体工厂)具体工厂是抽象工厂类的子类,实现了抽象工厂中返回一个具体产品类的实例。在具体工厂类中包含与应用程序调用以创建产品对象。

3.1.3模式分析工厂方法模式是简单工厂模式的进一步抽象和推广。工厂方法模式保持了简单工厂模式的优点,而且克服了的工厂类不再负责所有产品的创建,而是将具体创建工负责给出具体工厂必须实现的接口,而不负责哪一个产方法模式可以允许系统在不修改工厂角色的情况下引进类与产品类往往具有平行的等级结构,它们之间一一对应。通过分析,该组件中应用了工厂方法模式的类如下:FileItemFactory类(抽象工厂):是工厂方法的核心,它与应用程序无关。包含了抽象的工厂方法:FileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName);返回一个抽象产品FileItem对象。DiskFileItemFactory类(具体工厂):实现了抽象工厂方法FileItemcreateItem(),在工厂方法中创建并返回一个对象的具体产品。publicFileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName){DiskFileItemresult=newDiskFileItem(fieldName,contentType,isFormField,fileName,sizeThreshold,repository);FileCleaningTrackertracker=getFileCleaningTracker();if(tracker!=null){tracker.track(result.getTempFile(),result);}returnresult;}FileItem类(抽象产品),是一个接口,其中包含了产品类所具有的所有的业务方法。InputStreamgetInputStream()throwsIOException;StringgetContentType();StringgetName();booleanisInMemory();longgetSize();byte[]get();StringgetString(Stringencoding)throwsUnsupportedEncodingException;StringgetString();voidwrite(Filefile)throwsException;voiddelete();StringgetFieldName();voidsetFieldName(Stringname);booleanisFormField();voidsetFormField(booleanstate);OutputStreamgetOutputStream()throwsIOException;DiskFileItem类(具体产品类):是抽象产品FileItem接口的子类,实现了FileItem接口中所有的业务方法,以下就其中的部分方法的实现做介绍:publicInputStreamgetInputStream()throwsIOException{if(!isInMemory()){returnnewFileInputStream(dfos.getFile());}if(cachedContent==null){cachedContent=dfos.getData();}returnnewByteArrayInputStream(cachedContent);}3.2策略模式在FileUpload组建中的应用3.2.1策略模式定义策略模式(StrategyPattern)定义:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)策略模式是一种对象行为型模式。3.2.2策略模式结构图Context(环境类)环境类是使用算法的角色,它在解决某个问题时可以采用多种策略。在环境类中维护一个对抽象策略类的引用实例,用于定义所采用的策略。Strategy(抽象策略类)抽象策略类为所支持的算法申明了抽象方法,是所有策略类的父类,他可以是抽象类也可以是接口。环境类使用在其中声明的方法调用在具体策略类中实现的算法。concretStrategy(具体策略类)具体策略类实现了在抽象策略中定义的算法,在运行时,具体策略类将覆盖在环境泪中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

3.2.3策略模式分析策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。3.2.4策略模式在FileUpload组件中的分析类图如下:FileUpload类(环境类)publicclassFileUploadextendsFileUploadBase{privateFileItemFactoryfileItemFactory;publicFileUpload(){super();}publicFileUpload(FileItemFactoryfileItemFactory){super();this.fileItemFactory=fileItemFactory;}publicFileItemFactorygetFileItemFactory(){returnfileItemFactory;}publicvoidsetFileItemFactory(FileItemFactoryfactory){this.fileItemFactory=factory;}}FileUpload类是环境类,他定义并维持了对抽象策略类的一个引用,通过其方法privateFileItemFactoryfileItemFactory;可以在运行时设置一种具体策略,并在其算法下调用策略类提供的算法完成相应的业务处理。FileItemFactory类(抽象策略类)publicinterfaceFileItemFactory{FileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName);}FileItemFactory作为抽象策略类,它定义了算法的抽象定义,而在其子类DiskFileItemFactory类中实现了具体算法。DiskFileItemFactory类(具体策略类)publicclassDiskFileItemFactoryimplementsFileItemFactory{publicstaticfinalintDEFAULT_SIZE_THRESHOLD=10240;privateFilerepository;privateintsizeThreshold=DEFAULT_SIZE_THRESHOLD;privateFileCleaningTrackerfileCleaningTracker;publicDiskFileItemFactory(){this(DEFAULT_SIZE_THRESHOLD,null);}publicDiskFileItemFactory(intsizeThreshold,Filerepository){this.sizeThreshold=sizeThreshold;this.repository=repository;}publicFilegetRepository(){returnrepository;}publicvoidsetRepository(Filerepository){this.repository=repository;}publicintgetSizeThreshold(){returnsizeThreshold;}publicvoidsetSizeThreshold(intsizeThreshold){this.sizeThreshold=sizeThreshold;}publicFileItemcreateItem(StringfieldName,StringcontentType,booleanisFormField,StringfileName){DiskFileItemresult=newDiskFileItem(fieldName,contentType,isFormField,fileName,sizeThreshold,repository);FileCleaningTrackertracker=getFileCleaningTracker();if(tracker!=null){tracker.track(result.getTempFile(),result);}returnresult;}publicFileCleaningTrackergetFileCleaningTracker(){returnfileCleaningTracker;}publicvoidsetFileCleaningTracker(FileCleaningTrackerpTracker){fileCleaningTracker=pTracker;}}DiskFileItemFactory类作为FileItemFactory类的子类,是一种具体策略类,实现了抽象策略类中的方法。3.3迭代器模式在FileUpload组建中的应用3.3.1迭代器模式定义迭代器模式(Iteratorpattern)定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。3.3.2迭代器模式结构迭代器模式包含如下角色:Iterator(抽象迭代器)

抽象迭代器定义了访问和遍历元素的接口,一般声明如下方法:用于获取第一个元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的。urrentltemO,在其子类中将实现这些方法。Concretelterator(具体迭代器)

具体迭代器实现了抽象迭代器接口,完成对聚合对象的遍历,同时在对聚合进行遍历时跟踪其当前位置。Aggregate(抽象聚合类)抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口,声明一个createIterator()方法用于创建一个迭代器对象。4.ConcreteAggregate(具体聚合类)具体聚合类实现了创建相应迭代器的接口,实现了在聚合类中声明的createlterator()方法,该方法返回一个与该具体聚合对应的具体迭代器Concretelterator实例。

3.3.3迭代器模式分析根据“单一职责原则”,在面向对象设计时,对象承担的职责越少,则该对象的稳定性就很好,受到的约束也就越少,复用也就越方便。职责分离可以最大限度地减少彼此之间的耦合程度,从而建立一个松散藕合的对象网络,职责分离的要点是对被分离的职责进行封装,以抽象的方式建立起彼此之间的关系。以聚合对象为例,聚合是一个管理和组织数据对象的数据结构。这就表明聚合首先应备一个基本功能,即存储数据,这其中包含存储数据的类型、存储空间的大小、存储空间的配,以及存储的方式和顺序。如果不具备这些特点,则该对象就不能称为聚合对象。也就,存储数据是聚合对象最基本的职责。然而,聚合对象除了能够存储数据外,还必须提前遍历访问其内部数据的方式,同时这些遍历方式可能会根据不同的情形提供不同的实现正向遍历或逆向遍历等。因此,聚合对象主要拥有两个职责:一是存储内部数据;二是遍历内部数据。但是前者是聚合对象的基木功能,而后者是可以分离的。因此,我们将遍历聚合对象中数据的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象内部数据,这就是迭代器模式的本质。迭代器模式是“单一职责原则”的完美体现。经分析可知,迭代器模式在FileUpload组件中的应用情况如下:FileItemIterator(抽象迭代器):publicinterfaceFileItemIterator{booleanhasNext()throwsFileUploadException,IOException;FileItemStreamnext()throwsFileUploadException,IOException;}Next方法用于访问下一个元素,hasNext方法用于判断是否还有下一个元素。FileItemIteratorImpl(具体迭代器):privateclassFileItemIteratorImplimplementsFileItemIterator{FileItemIteratorImpl(RequestContextctx)throwsFileUploadException,IOException{if(ctx==null){thrownewNullPointerException("ctxparameter");}StringcontentType=ctx.getContentType();if((null==contentType)||(!contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART))){thrownewFileUploadBase.InvalidContentTypeException(format("therequestdoesn'tcontaina%sor%sstream,contenttypeheaderis%s",contentType));}.................(此处省略若干行)publicbooleanhasNext()throwsFileUploadException,IOException{if(eof){returnfalse;}if(itemValid){returntrue;}try{returnfindNextItem();}catch(FileUploadIOExceptione){//unwrapencapsulatedSizeExceptionthrow(FileUploadException)e.getCause();}}publicFileItemStreamnext()throwsFileUploadException,IOException{if(eof||(!itemValid&&!hasNext())){thrownewNoSuchElementException();}itemValid=false;returncurrentItem;}}抽象聚合类(FileItemStream)publicinterfaceFileItemStreamextendsFileItemHeadersSupport{publicstaticclassItemSkippedExceptionextendsIOException{privatestaticfinallongserialVersionUID=-7280778431581963740L;}InputStreamopenStream()throwsIOException;StringgetContentType();StringgetName();StringgetFieldName();booleanisFormField();}具体聚合类(FileItemStreamImpl)publicclassFileItemStreamImplimplementsFileItemStream{privatefinalStringcontentType;privatefinalStringfieldName;privatefinalStringname;privatefinalbooleanformField;privatefinalInputStreamstream;privatebooleanopened;privateFileItemHeadersheaders;FileItemStreamImpl(StringpName,StringpFieldName,StringpContentType,booleanpFormField,longpContentLength)throwsIOException{name=pName;fieldName=pFieldName;contentType=pContentType;formField=pFormField;......(省略若干行)publicStringgetContentType(){returncontentType;}publicStringgetFieldName(){returnfieldName;}publicStringgetName(){returnStreams.checkFileName(name);}publicbooleanisFormField(){returnformField;}publicInputStreamopenStream()throwsIOException{if(opened){thrownewIllegalStateException("Thestreamwasalreadyopened.");}if(((Closeable)stream).isClosed()){thrownewFileItemStream.ItemSkippedException();}returnstream;}voidclose()throwsIOException{stream.close();}publicFileItemHeadersgetHeaders(){returnheaders;}publicvoidsetHeaders(FileItemHeaderspHeaders){headers=pHeaders;}}3.4FileUpload组件中的重要类图3.4.1所有类汇总图:3.4.2重要类之间的类图:FileItem类

FileItem类用来封装单个表单字段元素的数据,一个表单字段元素对应一个FileItem对象,通过调用FileItem对象的方法可以获得相关表单字段元素的数据。FileItem是一个接口,在应用程序中使用的实际上是该接口一个实现类,该实现类的名称并不重要,程序可以采用FileItem接口类型来对它进行引用和访问,为了便于讲解,这里将FileItem实现类称之为FileItem类。FileItem类还实现了Serializable接口,以支持序列化操作。其中的重要方法为:isFormField方法用于判断FileItem类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段,如果是普通表单字段则返回true,否则返回false。该方法的完整语法定义如下:

publicbooleanisFormField();getName方法用于获得文件上传字段中的文件名。getName方法的完整语法定义如下:

publicStringgetName();write方法用于将FileItem对象中保存的主体内容保存到某个指定的文件中。其完整语法定义如下:

publicvoidwrite(Filefile);getString方法用于将FileItem对象中保存的主体内容作为一个字符串返回,它有两个重载的定义形式:

publicjava.lang.StringgetString()

publicjava.lang.StringgetString(java.lang.Stringencoding)

throwsjava.io.UnsupportedEncodingException;getContentType方法用于获得上传文件的类型,getContentType方法的完整语法定义如下:

publicStringgetContentType();isInMemory方法用来判断FileItem类对象封装的主体内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回true,否则返回false。其完整语法定义如下:

publicbooleanisInMemory();FileUploadException类在文件上传过程中,可能发生各种各样的异常,例如网络中断、数据丢失等等。为了对不同异常进行合适的处理,Apache文件上传组件还开发了四个异常类,其中FileUploadException是其他异常类的父类,其他几个类只是被间接调用的底层类,对于Apache组件调用人员来说,只需对FileUploadException异常类进行捕获和处理即可。MultipartStream类用来对上传的请求输入流进行解析,它是整个Apache上传组件中最复杂的类。

DiskFileUpload类是文件上传组件的核心类,它是一个总的控制类,首先由Apache文件上传组件的使用者直接调用DiskFileUpload类的方法,DiskFileUpload类再调用和协调更底层的类来完成具体的功能。解析类MultipartStream和工厂类DefaultFileItemFactory就是DiskFileUpload类调用的两个的底层类。MultipartStream类用于对请求消息中的实体数据进行具体解析,DefaultFileItemFactory类对MultipartStream类解析出来的数据进行封装,它将每个表单字段数据封装成一个个的FileItem类对象,用户通过FileItem类对象来获得相关表单字段的数据。DefaultFileItem是FileItem接口的实现类,实现了FileItem接口中定义的功能,用户只需关心FileItem接口,通过FileItem接口来使用DefaultFileItem类实现的功能。DefaultFileItem类使用了两个成员变量来分别存储表单字段数据的描述头和主体内容,其中保存主体内容的变量类型为DeferredFileOutputStream类。DeferredFileOutputStream类是一个输出流类型,在开始时,DeferredFileOutputStream类内部使用一个ByteArrayOutputStream类对象来存储数据,当写入它里面的主体内容的大小大于DiskFileUpload.setSizeThreshold方法设置的临界值时,DeferredFileOutputStream类内部创建一个文件输出流对象来存储数据,并将前面写入到ByteArrayOutputStream类对象中的数据转移到文件输出流对象中。这个文件输出流对象关联的文件是一个临时文件,它的保存路径由DiskFileUpload.setRepositoryPath方法指定。

结束语4.1收获与总结在这持续了近乎三个星期的时间里,我又把以往所学的设计模式知识点复习了一遍。这种开放式的课程设计,充分调动了我的主观能动性和自学的积极性,同时还让我对以往所学知识的疏忽得以补充。在课程设计过程中遇到的一系列问题,也在同学的热情帮助下,大豆得到了解决。比如:在分析FileUpload组件中使用的设计模式的时候,需要对这个组件中的一些类做逆向工程,然后得到类和接口之间的关系。由于之前课上讲过对JDK的分析,所以一开始就对FileUpload组件做类似的处理,但是怎么都行不通,也是在请教了同学,才知道只需要删除每个Java文件里的包的信息就可以实现,这才慢慢实现了逆向工程,得到了想要的类图,对此组件的分析才能一步一步按部就班的往下走。虽然这次课程设计主要是分析FileUpload组件中使用的设计模式,但是我觉得这次课程设计所了解的设计模式比前边上课的时候学习的知识点还要多,这次课设任务原则上是分析,其实就是对上学期所学知识点的做一个系统全面的复习,然后再将所学的知识加以应用。对于这个课题来说,就是找出这个组件中使用了哪些设计模式,并加以分析。作为一个软件工程专业的学生,编程能力却很渣,还不怎么愿意看先驱前辈们的代码,为了这次的课程设计,还是耐着头皮把这个组件中大部分类与接口的代码阅读了一遍,虽然并不怎么了解,但是看了好过不看。通过拜读大师们的代码,我发现我还是可以静下心来认真的做一件有意义的事情,此次课程设计,我发现了自身的不足,需要提升自我能力,用不恰当的话说就是:“革命尚未成功,同志人需努力|”。课程设计是培训学生运用本专业所学的理论知识和专业知识来分析解决实际问题的重要教学环节,是对所学知识的复习和巩固。因此,我们必须认真、谨慎、踏实、一步一步的完成设计。通过课程设计,我了解到一些实际与理论之间的差异;通过课程设计不仅可以巩固专业知识,为以后的工作打下了坚实的基础,而其还可以培养和熟练使用资料,运用工具书的能力,把我们所学的课本知识与实践结合起来,起到温故而知新的作用。4.2参考文献[1]刘伟,设计模式.北京:清华大学出版社,2021.[2]模式工程化实现及扩展.设计模式C#版/王翔,孙逊著.北京:电子工业出版社,2021

咖啡店创业计划书第一部分:背景在中国,人们越来越爱喝咖啡。随之而来的咖啡文化充满生活的每个时刻。无论在家里、还是在办公室或各种社交场合,人们都在品着咖啡。咖啡逐渐与时尚、现代生活联系在一齐。遍布各地的咖啡屋成为人们交谈、听音乐、休息的好地方,咖啡丰富着我们的生活,也缩短了你我之间的距离,咖啡逐渐发展为一种文化。随着咖啡这一有着悠久历史饮品的广为人知,咖啡正在被越来越多的中国人所理解。第二部分:项目介绍第三部分:创业优势目前大学校园的这片市场还是空白,竞争压力小。而且前期投资也不是很高,此刻国家鼓励大学生毕业后自主创业,有一系列的优惠政策以及贷款支持。再者大学生往往对未来充满期望,他们有着年轻的血液、蓬勃的朝气,以及初生牛犊不怕虎的精神,而这些都是一个创业者就应具备的素质。大学生在学校里学到了很多理论性的东西,有着较高层次的技术优势,现代大学生有创新精神,有对传统观念和传统行业挑战的信心和欲望,而这种创新精神也往往造就了大学生创业的动力源泉,成为成功创业的精神基础。大学生创业的最大好处在于能提高自己的潜力、增长经验,以及学以致用;最大的诱人之处是透过成功创业,能够实现自己的理想,证明自己的价值。第四部分:预算1、咖啡店店面费用咖啡店店面是租赁建筑物。与建筑物业主经过协商,以合同形式达成房屋租赁协议。协议资料包括房屋地址、面积、结构、使用年限、租赁费用、支付费用方法等。租赁的优点是投资少、回收期限短。预算10-15平米店面,启动费用大约在9-12万元。2、装修设计费用咖啡店的满座率、桌面的周转率以及气候、节日等因素对收益影响较大。咖啡馆的消费却相对较高,主要针对的也是学生人群,咖啡店布局、格调及采用何种材料和咖啡店效果图、平面图、施工图的设计费用,大约6000元左右3、装修、装饰费用具体费用包括以下几种。(1)外墙装饰费用。包括招牌、墙面、装饰费用。(2)店内装修费用。包括天花板、油漆、装饰费用,木工、等费用。(3)其他装修材料的费用。玻璃、地板、灯具、人工费用也应计算在内。整体预算按标准装修费用为360元/平米,装修费用共360*15=5400元。4、设备设施购买费用具体设备主要有以下种类。(1)沙发、桌、椅、货架。共计2250元(2)音响系统。共计450(3)吧台所用的烹饪设备、储存设备、洗涤设备、加工保温设备。共计600(4)产品制造使用所需的吧台、咖啡杯、冲茶器、各种小碟等。共计300净水机,采用美的品牌,这种净水器每一天能生产12l纯净水,每一天销售咖啡及其他饮料100至200杯,价格大约在人民币1200元上下。咖啡机,咖啡机选取的是电控半自动咖啡机,咖啡机的报价此刻就应在人民币350元左右,加上另外的附件也不会超过1200元。磨豆机,价格在330―480元之间。冰砂机,价格大约是400元一台,有点要说明的是,最好是买两台,不然夏天也许会不够用。制冰机,从制冰量上来说,一般是要留有富余。款制冰机每一天的制冰量是12kg。价格稍高550元,质量较好,所以能够用很多年,这么算来也是比较合算的。5、首次备货费用包括购买常用物品及低值易耗品,吧台用各种咖啡豆、奶、茶、水果、冰淇淋等的费用。大约1000元6、开业费用开业费用主要包括以下几种。(1)营业执照办理费、登记费、保险费;预计3000元(2)营销广告费用;预计450元7、周转金开业初期,咖啡店要准备必须量的流动资金,主要用于咖啡店开业初期的正常运营。预计2000元共计: 120000+6000+5400+2250+450+600+300+1200+1200+480+400+550+1000+3000+450+2000=145280元

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论