㈠ java 设计模式用了哪些
在JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改JDK源码的前提下开发出自己的应用软件,研究JDK类库中的模式实例也不失为学习如何使用设计模式的一个好方式。
(1)抽象工厂模式(Abstract Factory)
•Java.util.Calendar#getInstance()
•java.util.Arrays#asList()
•java.util.ResourceBundle#getBundle()
•java.NET.URL#openConnection()
•java.sql.DriverManager#getConnection()
•java.sql.Connection#createStatement()
•java.sql.Statement#executeQuery()
•java.text.NumberFormat#getInstance()
•java.lang.management.ManagementFactory (所有getXXX()方法)
•java.nio.charset.Charset#forName()
•javax.xml.parsers.DocumentBuilderFactory#newInstance()
•javax.xml.transform.TransformerFactory#newInstance()
•javax.xml.xpath.XPathFactory#newInstance()
(2)建造者模式(Builder)
•java.lang.StringBuilder#append()
•java.lang.StringBuffer#append()
•java.nio.ByteBuffer#put() (CharBuffer, ShortBuffer, IntBuffer,LongBuffer, FloatBuffer和DoubleBuffer与之类似)
•javax.swing.GroupLayout.Group#addComponent()
•java.sql.PreparedStatement
•java.lang.Appendable的所有实现类
(3)工厂方法模式(Factory Method)
•java.lang.Object#toString() (在其子类中可以覆盖该方法)
•java.lang.Class#newInstance()
•java.lang.Integer#valueOf(String) (Boolean, Byte, Character,Short, Long, Float和Double与之类似)
•java.lang.Class#forName()
•java.lang.reflect.Array#newInstance()
•java.lang.reflect.Constructor#newInstance()
(4)原型模式(Prototype)
•java.lang.Object#clone() (支持浅克隆的类必须实现java.lang.Cloneable接口)
(5)单例模式(Singleton)
•java.lang.Runtime#getRuntime()
•java.awt.Desktop#getDesktop()
(1)适配器模式(Adapter)
•java.util.Arrays#asList()
•javax.swing.JTable(TableModel)
•java.io.InputStreamReader(InputStream)
•java.io.OutputStreamWriter(OutputStream)
•javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
•javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()
(2)桥接模式(Bridge)
•AWT (提供了抽象层映射于实际的操作系统)
•JDBC
(3)组合模式(Composite)
•javax.swing.JComponent#add(Component)
•java.awt.Container#add(Component)
•java.util.Map#putAll(Map)
•java.util.List#addAll(Collection)
•java.util.Set#addAll(Collection)
(4)装饰模式(Decorator)
•java.io.BufferedInputStream(InputStream)
•java.io.DataInputStream(InputStream)
•java.io.BufferedOutputStream(OutputStream)
•java.util.zip.ZipOutputStream(OutputStream)
•java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()
(5)外观模式(Facade)
•java.lang.Class
•javax.faces.webapp.FacesServlet
(6)享元模式(Flyweight)
•java.lang.Integer#valueOf(int)
•java.lang.Boolean#valueOf(boolean)
•java.lang.Byte#valueOf(byte)
•java.lang.Character#valueOf(char)
(7)代理模式(Proxy)
•java.lang.reflect.Proxy
•java.rmi.*
(1)职责链模式(Chain of Responsibility)
•java.util.logging.Logger#log()
•javax.servlet.Filter#doFilter()
(2)命令模式(Command)
•java.lang.Runnable
•javax.swing.Action
(3)解释器模式(Interpreter)
•java.util.Pattern
•java.text.Normalizer
•java.text.Format
•javax.el.ELResolver
(4)迭代器模式(Iterator)
•java.util.Iterator
•java.util.Enumeration
(5)中介者模式(Mediator)
•java.util.Timer (所有scheleXXX()方法)
•java.util.concurrent.Executor#execute()
•java.util.concurrent.ExecutorService (invokeXXX()和submit()方法)
•java.util.concurrent.ScheledExecutorService (所有scheleXXX()方法)
•java.lang.reflect.Method#invoke()
(6)备忘录模式(Memento)
•java.util.Date
•java.io.Serializable
•javax.faces.component.StateHolder
(7)观察者模式(Observer)
•java.util.Observer/java.util.Observable
•java.util.EventListener (所有子类)
•javax.servlet.http.HttpSessionBindingListener
•javax.servlet.http.HttpSessionAttributeListener
•javax.faces.event.PhaseListener
(8)状态模式(State)
•java.util.Iterator
•javax.faces.lifecycle.LifeCycle#execute()
(9)策略模式(Strategy)
•java.util.Comparator#compare()
•javax.servlet.http.HttpServlet
•javax.servlet.Filter#doFilter()
(10)模板方法模式(Template Method)
•java.io.InputStream, java.io.OutputStream, java.io.Reader和java.io.Writer的所有非抽象方法
•java.util.AbstractList, java.util.AbstractSet和java.util.AbstractMap的所有非抽象方法
•javax.servlet.http.HttpServlet#doXXX()
(11)访问者模式(Visitor)
•javax.lang.model.element.AnnotationValue和AnnotationValueVisitor
•javax.lang.model.element.Element和ElementVisitor
•javax.lang.model.type.TypeMirror和TypeVisitor
㈡ 开发中都用到了那些设计模式用在什么场合
我用的多的是:
singleton:单例,用来减少垃圾对象和缓存用
factory:工厂模式,用来解耦(呵呵,其实模式都是用来解耦的)
facade和decorator:封装接口
command:命令模式,传递
Iterator:用来遍历对象
Observer:用来监听状态变化(现在习惯用listener机制替代)
templete:模板模式,用来处理相同的操作步骤
strategy:策略模式,策略选择
proxy:用来附加功能,属性或隐蔽。
bridge也很实用,用来解耦工厂与产品搭配之类的选择
㈢ 求一小java程序,用到三种设计模式,工厂、单例等等,三种就够
这个程序没法小。另外,单例是工厂的一个特例。严格说,是一个模式。可以尝试,用工厂模式+代理模式+合成模式写一个数据库连接池。工厂模式管理数据库链接,代理模式用来处理connection类的close等需要代理的方法,合成模式用来处理和封装代理对象和原对象的关联管理。可以下载一个数据库连接池的源码。一般的数据库连接池的源码一定至少包含这三种模式。
㈣ Java的工厂模式有哪一些,分别有什么作用,一般用在哪些地方
我简单的说下,举个例子,当我们的程序结构比较繁杂时,比如有100个类,而类中又有很多方法,这些方法之间都互相有依赖关系,也就是一个方法之间的某段逻辑处理需要用到另一个类中的代码逻辑,这种时候对于整个程序而言是非常不利于开发的(我们需要考虑到很多类、方法之间的耦合问题),那么就有一个概念了,也就是面对接口编程。通俗的说就是把类中的方法封装起来,外部调用的人完全不需要考虑方法是如何实现的,但是这样做也有一个不好的地方,我们的接口是不提供方法实现的,而需要在类中实现接口的方法。那么问题产生了,我们在new接口对象的时候需要明确的知道他的实例类。
想象一下,如果程序在继续庞大,接口非常多,接口实例类非常多,这样又会产生我们之前的问题(我们需要考虑到很多类、方法之间的耦合问题)那么这个时候就产生了一中设计思想,也就是工厂模式,这种模式的核心思想就是管理接口的实例对象,把接口和实例对象之间的关系封装起来处理,外部需要用到某个接口的实例时,由工厂进行分配,而不需要关注具体是哪个实例。
如果你做到比较复杂的程序时你应该就能体会到了。
㈤ 求Spring和hibernate的一些重要知识点和答案!
Spring
http://ke..com/view/23023.htm(网址)spring在英文里有春天、弹簧、跳跃和泉眼的意思。Spring 也表示是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
特点
◆方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
◆AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
◆声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
◆方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。
◆方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
◆降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
◆Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
编辑本段好处
在我们进入细节以前,让我们看一下Spring可以给一个工程带来的一些好处:
◆Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。
◆Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
◆Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
◆Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
◆Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
◆使用Spring构建的应用程序易于单元测试。
◆Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
◆Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
■Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
◆低侵入式设计,代码污染极低
◆ 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
◆Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
◆Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
◆Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
◆Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
编辑本段作用
Spring提供许多功能,在此我将快速地依次展示其各个主要方面。
首先,让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。
Spring的主要目的是使J2EE易用和促进好编程习惯。
Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供O/R mapping层,对此,已有友好的解决办法如Hibernate和JDO。
spring
Spring的目标是使已存在的技术更加易用。
例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。
Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,象许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)
Spring也得益于内在的一致性。
所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些。
并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。
Spring在应用服务器之间是可移植的。
当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的应用服务器上的用户。
编辑本段基本框架
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图所
Spring
示:
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
2、Spring 上下文:Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
3、Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
4、Spring DAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5、Spring ORM:Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
6、Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
7、Spring MVC 框架:MVC框架是一个全功能的构建 Web应用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,存放于Map;视图是一个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环境(Web 或EJB)、独立应用程序、测试环境之间重用。
hibernate
http://ke..com/view/7291.htmHibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
核心接口
Hibernate体系结构的概要图
Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这6个核心接口分别加以介绍。
Session接口
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
SessionFactory接口
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Configuration类
Configuration类负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。[1]
Transaction接口
Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码
Query和Criteria接口
Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语句或SQL语句两种表达方式。
㈥ 什么情况下会用到工厂模式
一般都是验证手机是否新机或
14天机
经常用到
别外高手修改
出厂设置
的
新手不建议修改容易变砖头
㈦ 什么是工厂模式,工厂模式优势是什么,什么时候使用
工厂方法
概述
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
适用性
1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
参与者
1.Proct
定义工厂方法所创建的对象的接口。
2.ConcreteProct
实现Proct接口。
3.Creator
声明工厂方法,该方法返回一个Proct类型的对象。
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProct对象。
可以调用工厂方法以创建一个Proct对象。
4.ConcreteCreator
重定义工厂方法以返回一个ConcreteProct实例。
类图
例子
Proct
public interface Work {
void doWork();
}
ConcreteProct
public class StudentWork implements Work {
public void doWork() {
System.out.println("学生做作业!");
}
}
public class TeacherWork implements Work {
public void doWork() {
System.out.println("老师审批作业!");
}
}
Creator
public interface IWorkFactory {
Work getWork();
}
ConcreteCreator
public class StudentWorkFactory implements IWorkFactory {
public Work getWork() {
return new StudentWork();
}
}
public class TeacherWorkFactory implements IWorkFactory {
public Work getWork() {
return new TeacherWork();
}
}
Test
public class Test {
public static void main(String[] args) {
IWorkFactory studentWorkFactory = new StudentWorkFactory();
studentWorkFactory.getWork().doWork();
IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
teacherWorkFactory.getWork().doWork();
}
}
result
学生做作业!
老师审批作业!
允许自由传播,但请保留页脚版权信息
Copyright © 2008 Angus Young
疯狂Java联盟:http://www.crazyit.org
摘自《Java设计模式(疯狂Java联盟版)》
㈧ spring中用到哪些设计模式
1.工厂模式,这个很明显,在各种BeanFactory以及ApplicationContext创建中都用到了;
2.模版模式,这个也很明显,在各种BeanFactory以及ApplicationContext实现中也都用到了;
3.代理模式,在Aop实现中用到了JDK的动态代理;
4.单例模式,这个比如在创建bean的时候。
5.Tomcat中有很多场景都使用到了外观模式,因为Tomcat中有很多不同的组件,每个组件需要相互通信,但又不能将自己内部数据过多地暴露给其他组件。用外观模式隔离数据是个很好的方法。
6.策略模式在Java中的应用,这个太明显了,因为Comparator这个接口简直就是为策略模式而生的。Comparable和Comparator的区别一文中,详细讲了Comparator的使用。比方说Collections里面有一个sort方法,因为集合里面的元素有可能是复合对象,复合对象并不像基本数据类型,可以根据大小排序,复合对象怎么排序呢?基于这个问题考虑,Java要求如果定义的复合对象要有排序的功能,就自行实现Comparable接口或Comparator接口.
7.原型模式:使用原型模式创建对象比直接new一个对象在性能上好得多,因为Object类的clone()方法是一个native方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
8.迭代器模式:Iterable接口和Iterator接口 这两个都是迭代相关的接口,可以这么认为,实现了Iterable接口,则表示某个对象是可被迭代的;Iterator接口相当于是一个迭代器,实现了Iterator接口,等于具体定义了这个可被迭代的对象时如何进行迭代的