㈠ 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介面,等於具體定義了這個可被迭代的對象時如何進行迭代的