第一篇:設(shè)計模式之心得
剛學(xué)幾天就有一些淺薄的心得了。
在學(xué)過的幾種設(shè)計模式中(目前為止,本人只學(xué)過創(chuàng)建性模式),每一種設(shè)計模式都會有一種具體的應(yīng)用場景,每一種場景描述的都是一種需求變化。設(shè)計模式就是用來解決這些變化的。
只要客戶有新的需求,你的程序就要發(fā)生改變,不管你用什么方法,這個改變是避免不了的。關(guān)鍵是你如何是解決這種變化!設(shè)計模式就是尋求一種通用的較好的方法來解決這種變化而不是避免這種變化,并不是你應(yīng)用了設(shè)計模式,你的系統(tǒng)就不會發(fā)生變化了。
面向?qū)ο蟮木幊逃腥髾C制,我個人認為,設(shè)計模式很好的利用了其中的“封裝與多態(tài)”(當(dāng)然并不是所有的設(shè)計模式都是這樣的,也不是說繼承就沒用,繼承在三大機制排第一呀,是基本的),比如工廠方法模式和生成器模式?!胺庋b”的意義不僅僅在于封裝代碼的實現(xiàn),更重要的是“封裝”系統(tǒng)中變化的部分。設(shè)計模式回答了怎么樣去“封裝”這種變化。
在一個系統(tǒng)中,總會有一部分經(jīng)常發(fā)生變化,相對的,也總有一個部分是改變頻率較低的,我們可以在某種范圍內(nèi)將其理解為不改變的部分。設(shè)計模式要作的事情就是把“變化”的部分封裝起來,實現(xiàn)將“變化”的部分與“不變化”的部隔離,這樣,“變化”的部分在發(fā)生變化時,不會影響到“不改變”的部分。如果你也學(xué)過設(shè)計模式,那你可能跟我有同感。設(shè)計模式解決變化的途徑可以概括為兩步(純屬個人見解):一是轉(zhuǎn)移變化,二是轉(zhuǎn)化變化。
首先是“轉(zhuǎn)移變化”。
簡單的說就是把A部分的變化轉(zhuǎn)移到B部分,請B去變化,讓A不發(fā)生變化。在程序中就是將變化從調(diào)用者轉(zhuǎn)移到被調(diào)用者。比如,你有一個類scene,這個類用于顯現(xiàn)一種風(fēng)格的游戲場景,調(diào)用程序?qū)嵗@個類并使用它。如果有一天,需求改變了,當(dāng)前風(fēng)格的游戲場景顏色太冷了,我需要改變當(dāng)前場景的顏色。這個時候你要決定,要讓誰去發(fā)生變化?是讓客戶調(diào)用程序去改變scene類的顏色屬性呢,還是讓你的類scene發(fā)生變化?設(shè)計模式回答的是,請scene發(fā)生變化,調(diào)用者不發(fā)生變化。
為什么要這樣回答,因為這個時候,你的系統(tǒng)可能已經(jīng)交付用戶了,如果讓調(diào)用者發(fā)生變化,那整個系統(tǒng)都要發(fā)生變化。(這里討論只是一個簡單的應(yīng)用,實際情況中往往沒有這里簡單。如果實際情況是這么簡單的話,設(shè)計模式估計就沒有用處了。)
然后是“轉(zhuǎn)化變化”。
確定了要改動scene,那要怎么樣去改scene呢?直接改嗎?當(dāng)然不行,如果是這樣改,那還不如讓調(diào)用者去設(shè)置scene的某個屬性呢,反正都要重新部署。那要怎么改?“擴展”,把這種“改變”轉(zhuǎn)化為“擴展”。你不是要另外一種
scene嗎?那我重新為你設(shè)計一個sence并生成.dll交付你,然后讓現(xiàn)有的程序去調(diào)用這個scene。當(dāng)然,這時可能需要調(diào)用者稍微的發(fā)生一下變化,比如開始調(diào)用者是直接調(diào)用scene來呈現(xiàn)場景的,現(xiàn)在將其改為根據(jù)配置文件來決定要呈現(xiàn)那種scene。但是如果之前你已經(jīng)考慮到這個問題了,那調(diào)用者是不需要發(fā)生任何變化的,因為調(diào)用者是根據(jù)配置來決定所呈現(xiàn)的場景,需求發(fā)生彎化,只需要改變配置文件(可能是一個XML),把調(diào)用者與新添的scene關(guān)聯(lián)即可,這樣一來,“改動”就變?yōu)椤皵U展”,其帶來的好處也是顯而易見的,這也就是所謂的“開閉”原則。
以上文字完全是本人理解,隨著不斷的學(xué)習(xí),我想這么文章估計要被改好多次,這是一個學(xué)習(xí)的過程。理解錯了、寫錯了都不要緊,關(guān)鍵是你怎么樣去面對這種錯誤!是拒絕承認錯誤還是正視錯誤?這也是設(shè)計模式回答的問題。
第二篇:設(shè)計模式初學(xué)心得
以前沒有接觸過設(shè)計模式,那其實也是因為以前沒有真正經(jīng)歷過面向?qū)ο蟮脑O(shè)計。這樣的情況在我經(jīng)歷了本科畢業(yè)設(shè)計,并且遵循我們實驗室的一位師兄的建議看了《設(shè)計模式精解》([美]Alan Shalloway & James R.Trott 著,熊節(jié) 譯)后有了根本的改變,我開始意識到一個程序員和一個設(shè)計者的區(qū)別,我也開始意識到在同學(xué)眼中“編程很強”的我只是——至少現(xiàn)在只是一個程序員。
我做的本科畢設(shè)是基于Java-Swing設(shè)計一個類似繪圖程序的系統(tǒng),最終我設(shè)計出來的程序,在別人看來很不錯。但是只有我自己知道,我的設(shè)計其實是糟糕了,最明顯的就是低內(nèi)聚、緊耦合,那些代碼甚至連我都不愿意去維護。于是當(dāng)我看到書中的一句話:“幾乎百分之百的軟件都不是由它最初的設(shè)計者去維護的??”,更讓我感到這次設(shè)計的失?。ň瓦B它的設(shè)計者都不原意去維護)。
《設(shè)計模式精解》的出現(xiàn)可以說讓我眼前一亮,這也是第一本讓我想再讀一次的書(即使現(xiàn)在我還沒有讀完)。究竟什么是模式?書中的解釋是“模式是針對特定場景下的特定問題的可重復(fù)、可表達的解決方案”,除此之外模式還必須有三個要點:
1.可重復(fù)性。解決方案應(yīng)該對應(yīng)于外部的場景。
2.可傳授性。一個解決方案應(yīng)該可以移植到問題的不同情況中(絕大多數(shù)模式的可傳授性都建立在“約束”和“效果”的基礎(chǔ)上)。
3.用來表示這個模式的名稱。
模式不限于面向?qū)ο?,不限于設(shè)計階段,甚至不限于軟件開發(fā)領(lǐng)域。設(shè)計模式只是模式的一個子集。
在前言中作者說在他對現(xiàn)有的設(shè)計模式的指導(dǎo)原則及策略都非常清楚之后,這些原則幫助他決定開始過一種為人解惑的生活??雖然我第一次看到“為人解惑的生活”這個詞語,但是我立刻感到這也是我所向往的一種生活。
書中介紹了軟件開發(fā)過程中的三個不同視角:
1.概念視角。這個視角“展現(xiàn)了問題領(lǐng)域中的概念??一個概念模型可以在對實現(xiàn)軟件有很少或毫無注意的情況下畫出??”
2.規(guī)格視角。“只看軟件的接口,而不看實現(xiàn)”
3.實現(xiàn)視角。就是現(xiàn)在的我唯一使用的視角——置身于代碼之中。
看到這里我更加肯定了這本所講的是我從來沒有注意過的東西,但是我對這些東西應(yīng)該非常感興趣,而我也深深地感慨:我為什么現(xiàn)在才看到這本書。
在書中作者回顧了它從前的一個設(shè)計,通過不斷修改得出的優(yōu)秀設(shè)計,逐步展現(xiàn)出設(shè)計模式的強大威力。書中有句話很經(jīng)典——如果你只有一把錘子,那你會發(fā)現(xiàn)所有的東西都像釘子。意思是說如果你只知道一種解決問題的辦法,那你只會想用這個方法解決所有問題。我覺得這很像現(xiàn)在的我,在面向?qū)ο蟮脑O(shè)計中我?guī)缀踔粫邦惱^承”,結(jié)果是我的畢設(shè)——過高的繼承體系導(dǎo)致緊耦合、低內(nèi)聚。
當(dāng)我學(xué)到書中介紹的第一個設(shè)計模式:Facade模式,我立刻對這些設(shè)計模式產(chǎn)生了濃厚的興趣,我發(fā)現(xiàn)自己像一個“完美主義者”,在試圖追求結(jié)構(gòu)完美的程序代碼(可讀性好、易于維護),而設(shè)計模式給我提供了這樣的可能,盡管我僅僅看到了它的一點點部分。設(shè)計模式就像一個漂亮的女孩,而且你知道她不僅外表很漂亮,也很有內(nèi)涵,那你想做的事情還有什么呢?當(dāng)然是盡快接近并了解她??
第三篇:JAVA設(shè)計模式之創(chuàng)建模式
設(shè)計模式之Builder
Builder模式定義: 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示.Builder模式是一步一步創(chuàng)建一個復(fù)雜的對象,它允許用戶可以只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們.用戶不知道內(nèi)部的具體構(gòu)建細節(jié).Builder模式是非常類似抽象工廠模式,細微的區(qū)別大概只有在反復(fù)使用中才能體會到.為何使用?
是為了將構(gòu)建復(fù)雜對象的過程和它的部件解耦.注意: 是解耦過程和部件.因為一個復(fù)雜的對象,不但有很多大量組成部分,如汽車,有很多部件:車輪 方向盤 發(fā)動機還有各種小零件等等,部件很多,但遠不止這些,如何將這些部件裝配成一輛汽車,這個裝配過程也很復(fù)雜(需要很好的組裝技術(shù)),Builder模式就是為了將部件和組裝過程分開.如何使用?
首先假設(shè)一個復(fù)雜對象是由多個部件組成的,Builder模式是把復(fù)雜對象的創(chuàng)建和部件的創(chuàng)建分別開來,分別用Builder類和Director類來表示.首先,需要一個接口,它定義如何創(chuàng)建復(fù)雜對象的各個部件: public interface Builder {
//創(chuàng)建部件A 比如創(chuàng)建汽車車輪
void buildPartA();
//創(chuàng)建部件B 比如創(chuàng)建汽車方向盤
void buildPartB();
//創(chuàng)建部件C 比如創(chuàng)建汽車發(fā)動機
void buildPartC();
//返回最后組裝成品結(jié)果(返回最后裝配好的汽車)
//成品的組裝過程不在這里進行,而是轉(zhuǎn)移到下面的Director類中進行.//從而實現(xiàn)了解耦過程和部件
Product getResult();} 用Director構(gòu)建最后的復(fù)雜對象,而在上面Builder接口中封裝的是如何創(chuàng)建一個個部件(復(fù)雜對象是由這些部件組成的),也就是說Director的內(nèi)容是如何將部件最后組裝成成品: public class Director {
private Builder builder;
public Director(Builder builder){
this.builder = builder;} // 將部件partA partB partC最后組成復(fù)雜對象 //這里是將車輪 方向盤和發(fā)動機組裝成汽車的過程 public void construct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
} } Builder的具體實現(xiàn)ConcreteBuilder: 通過具體完成接口Builder來構(gòu)建或裝配產(chǎn)品的部件;定義并明確它所要創(chuàng)建的是什么具體東西;提供一個可以重新獲取產(chǎn)品的接口: public class ConcreteBuilder implements Builder {
Part partA, partB, partC;public void buildPartA(){
//這里是具體如何構(gòu)建partA的代碼
};public void buildPartB(){
//這里是具體如何構(gòu)建partB的代碼 };public void buildPartC(){
//這里是具體如何構(gòu)建partB的代碼 };public Product getResult(){
//返回最后組裝成品結(jié)果 };} 復(fù)雜對象:產(chǎn)品Product: public interface Product { } 復(fù)雜對象的部件: public interface Part { }
我們看看如何調(diào)用Builder模式: ConcreteBuilder builder = new ConcreteBuilder();Director director = new Director(builder);
director.construct();Product product = builder.getResult();Builder模式的應(yīng)用
在Java實際使用中,我們經(jīng)常用到“池”(Pool)的概念,當(dāng)資源提供者無法提供足夠的資源,并且這些資源需要被很多用戶反復(fù)共享時,就需要使用池.“池”實際是一段內(nèi)存,當(dāng)池中有一些復(fù)雜的資源的“斷肢”(比如數(shù)據(jù)庫的連接池,也許有時一個連接會中斷),如果循環(huán)再利用這些“斷肢”,將提高內(nèi)存使用效率,提高池的性能.修改Builder模式中Director類使之能診斷“斷肢”斷在哪個部件上,再修復(fù)這個部件.設(shè)計模式之Factory
定義:提供創(chuàng)建對象的接口.為何使用?
工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統(tǒng)可以說是隨處可見。
為什么工廠模式是如此常用?因為工廠模式就相當(dāng)于創(chuàng)建實例對象的new,我們經(jīng)常要根據(jù)類Class生成實例對象,如A a=new A()工廠模式也是用來創(chuàng)建實例對象的,所以以后new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做一些工作,但會給你系統(tǒng)帶來更大的可擴展性和盡量少的修改量。我們以類Sample為例,如果我們要創(chuàng)建Sample的實例對象: Sample sample=new Sample();可是,實際情況是,通常我們都要在創(chuàng)建sample實例時做點初始化的工作,比如賦值 查詢數(shù)據(jù)庫等。
首先,我們想到的是,可以使用Sample的構(gòu)造函數(shù),這樣生成實例就寫成: Sample sample=new Sample(參數(shù));但是,如果創(chuàng)建sample實例時所做的初始化工作不是象賦值這樣簡單的事,可能是很長一段代碼,如果也寫入構(gòu)造函數(shù)中,那你的代碼很難看了(就需要Refactor重整)。為什么說代碼很難看,初學(xué)者可能沒有這種感覺,我們分析如下,初始化工作如果是很長一段代碼,說明要做的工作很多,將很多工作裝入一個方法中,相當(dāng)于將很多雞蛋放在一個籃子里,是很危險的,這也是有背于Java面向?qū)ο蟮脑瓌t,面向?qū)ο蟮姆庋b(Encapsulation)和分派(Delegation)告訴我們,盡量將長的代碼分派“切割”成每段,將每段再“封裝”起來(減少段和段之間偶合聯(lián)系性),這樣,就會將風(fēng)險分散,以后如果需要修改,只要更改每段,不會再發(fā)生牽一動百的事情。
在本例中,首先,我們需要將創(chuàng)建實例的工作與使用實例的工作分開, 也就是說,讓創(chuàng)建實例所需要的大量初始化工作從Sample的構(gòu)造函數(shù)中分離出去。
這時我們就需要Factory工廠模式來生成對象了,不能再用上面簡單new Sample(參數(shù))。還有,如果Sample有個繼承如MySample, 按照面向接口編程,我們需要將Sample抽象成一個接口.現(xiàn)在Sample是接口,有兩個子類MySample 和HisSample.我們要實例化他們時,如下: Sample mysample=new MySample();Sample hissample=new HisSample();隨著項目的深入,Sample可能還會“生出很多兒子出來”, 那么我們要對這些兒子一個個實例化,更糟糕的是,可能還要對以前的代碼進行修改:加入后來生出兒子的實例.這在傳統(tǒng)程序中是無法避免的.但如果你一開始就有意識使用了工廠模式,這些麻煩就沒有了.工廠方法
你會建立一個專門生產(chǎn)Sample實例的工廠: public class Factory{
public static Sample creator(int which){
//getClass 產(chǎn)生Sample 一般可使用動態(tài)類裝載裝入類。if(which==1)
return new SampleA();else if(which==2)
return new SampleB();
} } 那么在你的程序中,如果要實例化Sample時.就使用 Sample sampleA=Factory.creator(1);這樣,在整個就不涉及到Sample的具體子類,達到封裝效果,也就減少錯誤修改的機會,這個原理可以用很通俗的話來比喻:就是具體事情做得越多,越容易范錯誤.這每個做過具體工作的人都深有體會,相反,官做得越高,說出的話越抽象越籠統(tǒng),范錯誤可能性就越少.好象我們從編程序中也能悟出人生道理?呵呵.使用工廠方法 要注意幾個角色,首先你要定義產(chǎn)品接口,如上面的Sample,產(chǎn)品接口下有Sample接口的實現(xiàn)類,如SampleA,其次要有一個factory類,用來生成產(chǎn)品Sample,如下圖,最右邊是生產(chǎn)的對象Sample:
進一步稍微復(fù)雜一點,就是在工廠類上進行拓展,工廠類也有繼承它的實現(xiàn)類concreteFactory了。抽象工廠
工廠模式中有: 工廠方法(Factory Method)抽象工廠(Abstract Factory).這兩個模式區(qū)別在于需要創(chuàng)建對象的復(fù)雜程度上。如果我們創(chuàng)建對象的方法變得復(fù)雜了,如上面工廠方法中是創(chuàng)建一個對象Sample,如果我們還有新的產(chǎn)品接口Sample2.這里假設(shè):Sample有兩個concrete類SampleA和SamleB,而Sample2也有兩個concrete類Sample2A和SampleB2 那么,我們就將上例中Factory變成抽象類,將共同部分封裝在抽象類中,不同部分使用子類實現(xiàn),下面就是將上例中的Factory拓展成抽象工廠: public abstract class Factory{
public abstract Sample creator();
public abstract Sample2 creator(String name);} public class SimpleFactory extends Factory{
public Sample creator(){
.........return new SampleA } public Sample2 creator(String name){
.........return new Sample2A } } public class BombFactory extends Factory{
public Sample creator(){
......return new SampleB } public Sample2 creator(String name){
......return new Sample2B } }
從上面看到兩個工廠各自生產(chǎn)出一套Sample和Sample2,也許你會疑問,為什么我不可以使用兩個工廠方法來分別生產(chǎn)Sample和Sample2? 抽象工廠還有另外一個關(guān)鍵要點,是因為 SimpleFactory內(nèi),生產(chǎn)Sample和生產(chǎn)Sample2的方法之間有一定聯(lián)系,所以才要將這兩個方法捆綁在一個類中,這個工廠類有其本身特征,也許制造過程是統(tǒng)一的,比如:制造工藝比較簡單,所以名稱叫SimpleFactory。在實際應(yīng)用中,工廠方法用得比較多一些,而且是和動態(tài)類裝入器組合在一起應(yīng)用,舉例
我們以Jive的ForumFactory為例,這個例子在前面的Singleton模式中我們討論過,現(xiàn)在再討論其工廠模式: public abstract class ForumFactory {
private static Object initLock = new Object();
private static String className = “com.jivesoftware.forum.database.DbForumFactory”;
private static ForumFactory factory = null;
public static ForumFactory getInstance(Authorization authorization){
//If no valid authorization passed in, return null.if(authorization == null){
return null;
}
//以下使用了Singleton 單態(tài)模式
if(factory == null){
synchronized(initLock){
if(factory == null){
......}
}
} try {
//動態(tài)轉(zhuǎn)載類
Class c = Class.forName(className);
factory =(ForumFactory)c.newInstance();} catch(Exception e){
return null;}
//Now, 返回 proxy.用來限制授權(quán)對forum的訪問
return new ForumFactoryProxy(authorization, factory,factory.getPermissions(authorization));
}
//真正創(chuàng)建forum的方法由繼承forumfactory的子類去完成.public abstract Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException;
....}
因為現(xiàn)在的Jive是通過數(shù)據(jù)庫系統(tǒng)存放論壇帖子等內(nèi)容數(shù)據(jù),如果希望更改為通過文件系統(tǒng)實現(xiàn),這個工廠方法ForumFactory就提供了提供動態(tài)接口: private static String className = “com.jivesoftware.forum.database.DbForumFactory”;你可以使用自己開發(fā)的創(chuàng)建forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.在上面的一段代碼中一共用了三種模式,除了工廠模式外,還有Singleton單態(tài)模式,以及proxy模式,proxy模式主要用來授權(quán)用戶對forum的訪問,因為訪問forum有兩種人:一個是注冊用戶 一個是游客guest,那么那么相應(yīng)的權(quán)限就不一樣,而且這個權(quán)限是貫穿整個系統(tǒng)的,因此建立一個proxy,類似網(wǎng)關(guān)的概念,可以很好的達到這個效果.看看Java寵物店中的CatalogDAOFactory: public class CatalogDAOFactory {
/**
* 本方法制定一個特別的子類來實現(xiàn)DAO模式。
* 具體子類定義是在J2EE的部署描述器中。
*/
public static CatalogDAO getDAO()throws CatalogDAOSysException {
CatalogDAO catDao = null;
try {
InitialContext ic = new InitialContext();//動態(tài)裝入CATALOG_DAO_CLASS //可以定義自己的CATALOG_DAO_CLASS,從而在無需變更太多代碼 //的前提下,完成系統(tǒng)的巨大變更。
String className =(String)ic.lookup(JNDINames.CATALOG_DAO_CLASS);
catDao =(CatalogDAO)Class.forName(className).newInstance();
} catch(NamingException ne){
throw new CatalogDAOSysException(“
CatalogDAOFactory.getDAO: NamingException while
getting DAO type : n” + ne.getMessage());
} catch(Exception se){
throw new CatalogDAOSysException(“
CatalogDAOFactory.getDAO: Exception while getting
DAO type : n” + se.getMessage());
}
return catDao;
} } CatalogDAOFactory是典型的工廠方法,catDao是通過動態(tài)類裝入器className獲得CatalogDAOFactory具體實現(xiàn)子類,這個實現(xiàn)子類在Java寵物店是用來操作catalog數(shù)據(jù)庫,用戶可以根據(jù)數(shù)據(jù)庫的類型不同,定制自己的具體實現(xiàn)子類,將自己的子類名給與CATALOG_DAO_CLASS變量就可以。
由此可見,工廠方法確實為系統(tǒng)結(jié)構(gòu)提供了非常靈活強大的動態(tài)擴展機制,只要我們更換一下具體的工廠方法,系統(tǒng)其他地方無需一點變換,就有可能將系統(tǒng)功能進行改頭換面的變化。
設(shè)計模式之Prototype(原型)
定義: 用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象.Prototype模式允許一個對象再創(chuàng)建另外一個可定制的對象,根本無需知道任何如何創(chuàng)建的細節(jié),工作原理是:通過將一個原型對象傳給那個要發(fā)動創(chuàng)建的對象,這個要發(fā)動創(chuàng)建的對象通過請求原型對象拷貝它們自己來實施創(chuàng)建。如何使用? 因為Java中的提供clone()方法來實現(xiàn)對象的克隆(具體了解clone()按這里),所以Prototype模式實現(xiàn)一下子變得很簡單.以勺子為例:
public abstract class AbstractSpoon implements Cloneable {
String spoonName;
public void setSpoonName(String spoonName){this.spoonName = spoonName;}
public String getSpoonName(){return this.spoonName;}
public Object clone()
{
Object object = null;
try {
object = super.clone();
} catch(CloneNotSupportedException exception){
System.err.println(“AbstractSpoon is not Cloneable”);
}
return object;
} } 有兩個具體實現(xiàn)(ConcretePrototype): public class SoupSpoon extends AbstractSpoon {
public SoupSpoon()
{
setSpoonName(“Soup Spoon”);
} } public class SaladSpoon extends AbstractSpoon {
public SaladSpoon()
{
setSpoonName(“Salad Spoon”);
} } 調(diào)用Prototype模式很簡單: AbstractSpoon spoon = new SoupSpoon();AbstractSpoon spoon = new SaladSpoon();當(dāng)然也可以結(jié)合工廠模式來創(chuàng)建AbstractSpoon實例。
在Java中Prototype模式變成clone()方法的使用,由于Java的純潔的面向?qū)ο筇匦?,使得在Java中使用設(shè)計模式變得很自然,兩者已經(jīng)幾乎是渾然一體了。這反映在很多模式上,如Interator遍歷模式。
設(shè)計模式之Singleton(單態(tài))
定義: Singleton模式主要作用是保證在Java應(yīng)用程序中,一個類Class只有一個實例存在。在很多操作中,比如建立目錄 數(shù)據(jù)庫連接都需要這樣的單線程操作。
還有, singleton能夠被狀態(tài)化;這樣,多個單態(tài)類在一起就可以作為一個狀態(tài)倉庫一樣向外提供服務(wù),比如,你要論壇中的帖子計數(shù)器,每次瀏覽一次需要計數(shù),單態(tài)類能否保持住這個計數(shù),并且能synchronize的安全自動加1,如果你要把這個數(shù)字永久保存到數(shù)據(jù)庫,你可以在不修改單態(tài)接口的情況下方便的做到。
另外方面,Singleton也能夠被無狀態(tài)化。提供工具性質(zhì)的功能,Singleton模式就為我們提供了這樣實現(xiàn)的可能。使用Singleton的好處還在于可以節(jié)省內(nèi)存,因為它限制了實例的個數(shù),有利于Java垃圾回收(garbage collection)。
我們常??吹焦S模式中類裝入器(class loader)中也用Singleton模式實現(xiàn)的,因為被裝入的類實際也屬于資源。如何使用?
一般Singleton模式通常有幾種形式: public class Singleton {
private Singleton(){}
//在自己內(nèi)部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內(nèi)部調(diào)用
private static Singleton instance = new Singleton();
}
第二種形式: public class Singleton {
private static Singleton instance = null;public static synchronized Singleton getInstance(){
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!if(instance==null)
instance=new Singleton();return instance;} //這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問
public static Singleton getInstance(){
return instance;
} }
使用Singleton.getInstance()可以訪問單態(tài)類。
上面第二中形式是lazy initialization,也就是說第一次調(diào)用時初始Singleton,以后就不用再生成了。
注意到lazy initialization形式中的synchronized,這個synchronized很重要,如果沒有synchronized,那么使用getInstance()是有可能得到多個Singleton實例。關(guān)于lazy initialization的Singleton有很多涉及double-checked locking(DCL)的討論,有興趣者進一步研究。
一般認為第一種形式要更加安全些。使用Singleton注意事項:
有時在某些情況下,使用Singleton并不能達到Singleton的目的,如有多個Singleton對象同時被不同的類裝入器裝載;在EJB這樣的分布式系統(tǒng)中使用也要注意這種情況,因為EJB是跨服務(wù)器,跨JVM的。
我們以SUN公司的寵物店源碼(Pet Store 1.3.1)的ServiceLocator為例稍微分析一下:
在Pet Store中ServiceLocator有兩種,一個是EJB目錄下;一個是WEB目錄下,我們檢查這兩個ServiceLocator會發(fā)現(xiàn)內(nèi)容差不多,都是提供EJB的查詢定位服務(wù),可是為什么要分開呢?仔細研究對這兩種ServiceLocator才發(fā)現(xiàn)區(qū)別:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator屬于資源定位,理所當(dāng)然應(yīng)該使用Singleton模式。但是在EJB中,Singleton模式已經(jīng)失去作用,所以ServiceLocator才分成兩種,一種面向WEB服務(wù)的,一種是面向EJB服務(wù)的。
Singleton模式看起來簡單,使用方法也很方便,但是真正用好,是非常不容易,需要對Java的類 線程 內(nèi)存等概念有相當(dāng)?shù)牧私?。進一步深入可參考:
Double-checked locking and the Singleton pattern When is a singleton not a singleton?
第四篇:英語教學(xué)模式心得
英語教學(xué)模式心得
我校“以學(xué)導(dǎo)教,三精兩清”的教學(xué)模式,三年的探索與總結(jié),幾近成熟,結(jié)合我們進行了三年課堂教學(xué)改革的課題,針對我校實際,英語組老師提出了“預(yù)習(xí)新知、展示交流、知識點撥、堂清反饋”創(chuàng)新模式。課改對學(xué)生的自信心也有了一定的提高,班級課堂活動參與率大大提升。許多之前不敢發(fā)言的同學(xué)在小組活動中,也能大膽的參與到課堂討論學(xué)習(xí)中來,學(xué)生的學(xué)習(xí)興趣和積極性得到了充分的提高。我們通過實踐論證,一致認為:好的教學(xué)模式可以充分調(diào)動學(xué)生學(xué)習(xí)的積極性、充分發(fā)揮學(xué)生學(xué)習(xí)的自主性、探究性,有機地讓學(xué)生的創(chuàng)造性思維在綜合探究的學(xué)習(xí)過程中得到充分的展示,實踐后和同行們進行了反復(fù)論證,并進行反思和總結(jié)。經(jīng)過一段時間的實踐,收到良好的教學(xué)效果。
我作為一名一線教師開始在教學(xué)中摸索嘗試、使自己能進一步把理念和實踐合二為一,下面就把我一些體會和方法和大家一起探討一下。
(一)成功之處:
1、讓課改悄悄走進學(xué)生的課堂,從而潛移默化地改變學(xué)生學(xué)習(xí)的方式。
首先,自從課題改革實施以來,我們改變了以往課堂上一成不變的教學(xué)模式,通過各種形式的教學(xué)環(huán)節(jié)改革,極大地調(diào)動了學(xué)生學(xué)習(xí)的積極性與主動性,激發(fā)了學(xué)生學(xué)習(xí)英語的自主性和興趣。
當(dāng)我們把“預(yù)習(xí)新知、展示交流、知識點撥、堂清反饋”這些任務(wù)交給學(xué)生來完成時,沒想到收到了許多意想不到的驚喜。例如,以前的課前檢查都是由老師親自檢查學(xué)生作業(yè)、練習(xí)的完成情況,于是有個別學(xué)生就會抄襲別人的作業(yè),以應(yīng)付檢查。而現(xiàn)在我們在課前安排了“自主學(xué)習(xí)”這一環(huán)節(jié),由小組長檢查并幫助組內(nèi)的“學(xué)困生”完成基礎(chǔ)練習(xí),這樣以來,基本上能夠杜絕抄襲,“學(xué)困生”在組長的幫助下主動完成不會的部分,并搞懂了不會的原因,這比起以前的抄襲就要有效得多。
課前熱身時,采用每組抽一個學(xué)生上黑板展示單詞或句子,而其他同學(xué)在老師聽寫時,大聲站起來搶答的模式,對課前預(yù)習(xí)進行一個小小的匯報,并同時給予優(yōu)勝者一顆紅星獎勵。通過這樣的“自主學(xué)習(xí)展示”,也使得學(xué)生的學(xué)習(xí)完全是自愿的和積極主動的,而且具有強烈的自主學(xué)習(xí)的愿望,而且還養(yǎng)成了良好的課前預(yù)習(xí)的好習(xí)慣。學(xué)生的學(xué)習(xí)也就不再是被動的而是變得較為主動,可以盡情的展示他們自學(xué)的收獲。往往是學(xué)生主動要求老師早上課,盡快檢查他們準備好的表演和展示。而教師也可以通過學(xué)生的展示較為充分地了解學(xué)生的預(yù)習(xí)情況,并有針對性的進行預(yù)設(shè),很好的使用教材。
其次是更多的關(guān)注了學(xué)生學(xué)習(xí)過程的情感態(tài)度價值觀———停下來傾聽學(xué)生的心聲。在講完了某一知識點后可以用更多的時間來讓學(xué)生展示自己對學(xué)習(xí)內(nèi)容的理解。如:展示交流、知識點撥等。通過學(xué)生的匯報,給他們提供了自我表達的空間與交流的平臺,樹立了他們學(xué)習(xí)英語的自信心,同時也檢測了同學(xué)們對知識掌握的深與淺,便于及時調(diào)控課堂,及時關(guān)注學(xué)生學(xué)習(xí)的情況?!疤们宸答仭眲t是學(xué)生對知識的整合,是對自己學(xué)習(xí)的檢驗、總結(jié)。他們的暢所欲言讓學(xué)生有了充分展示自我的機會,給他們帶來了學(xué)習(xí)的希望,讓他們感受到了學(xué)習(xí)的快樂。
2.、課改走進了學(xué)生的課堂,也轉(zhuǎn)變了教師的教學(xué)理念,使我們不斷地改進了教學(xué)方法,激活了學(xué)生的自主思維,一切皆源于學(xué)生自愿的學(xué)習(xí)與努力。
首先,預(yù)習(xí)新知打破了以往循規(guī)蹈矩的聽寫與檢查,它給學(xué)生以自由表達的愿望,通過學(xué)生自我小結(jié)式的匯報,激發(fā)了他們自主學(xué)習(xí)的愿望。教學(xué)時,教師設(shè)置課前任務(wù):明確學(xué)習(xí)目標、生成本課題的重點、難點并初步達成學(xué)習(xí)目標。其基本過程是:學(xué)生根據(jù)自學(xué)后對課本內(nèi)容的把握,教師根據(jù)對課程標準的把握,通過師生共同討論,預(yù)設(shè)學(xué)習(xí)目標。然后,學(xué)生在通過自學(xué)、生生互動、師生互動等形式初步達成預(yù)設(shè)的目標,并對自己找出的重點、難點問題進行深入的探究,并在此基礎(chǔ)上不斷生成新的學(xué)習(xí)目標,為展示課做準備。學(xué)生提前搜集資料,整理資料,形成文字材料,上課時讓學(xué)生展示勞動成果。通過設(shè)計任務(wù),有助于學(xué)生擴寬英語視野,提升信息的判斷能力和信息的運用能力。同時,課前準備由人物入手,有利于激發(fā)學(xué)生的學(xué)習(xí)熱情和興趣,對理解教材內(nèi)容也很有幫助。如:對某個單詞用法的認識,是通過他們的自主學(xué)習(xí)去完成的,他有了學(xué)習(xí)的愿望,就有興趣去記憶它,分析它,辨別它。這樣通過自己的認知再將自己的所獲展示出來就有一種驕傲感和自豪感。諸如對短語的理解也是一樣,對課文的朗讀以及應(yīng)用都是通過自愿的方式來完成學(xué)習(xí)的任務(wù),所以說我們更多的是關(guān)注了學(xué)生的情感和態(tài)度。其次,利用情景教學(xué)模式,積極營造學(xué)生學(xué)習(xí)的英語情景,圍繞教學(xué)目標,譴用詞匯、圖片、聲音、動畫、視頻等不同形態(tài)的信息對所授教學(xué)內(nèi)容和意境進行生動的再現(xiàn),拓展學(xué)生視野。
通過精心編寫 “情境營造” 和一個個由淺入深、力度大的問題設(shè)計,充分調(diào)動了學(xué)生的學(xué)習(xí)情緒,強化了學(xué)生不斷進行探究的內(nèi)在動機,讓學(xué)生自主探索解決問題的方法與步驟,并建構(gòu)知識體系。在學(xué)生展示后,針對每位學(xué)生的表現(xiàn),作適當(dāng)?shù)狞c評;在學(xué)生探究問題過程中,及時給予相應(yīng)的引導(dǎo)和啟發(fā),尤其是加強對學(xué)習(xí)方法的指導(dǎo)。
我校的堂清環(huán)節(jié)教師能從學(xué)情出發(fā),從教育教學(xué)的規(guī)律出發(fā),使教學(xué)內(nèi)容、方法等符合學(xué)生的認知規(guī)律和特點,我覺的很好,但在實施一段時間中我發(fā)現(xiàn)堂清練習(xí)優(yōu)秀生吃不飽后進生堂清不了,我計劃今后在堂清環(huán)節(jié)中進行分層練習(xí),在當(dāng)堂訓(xùn)練環(huán)節(jié)中設(shè)置必做題、選做題、思考題3類題型。尖子生不僅要完成必做題,還必須完成選做題,最好能做思考題。這樣讓不同層次的學(xué)生都能在在課堂上全身心投入,積極地實踐,認真地思考,讓差的變好,讓好的更好;用“成功更是成功之母”的思想來教育學(xué)生,從而讓每位學(xué)生在自學(xué)、互助中發(fā)展,達到培優(yōu)補差的目的。
(二)需要改進之處:
1、注意選擇整合各種資料,恰當(dāng)?shù)丶右詫嶋H運用。
通過教改我們發(fā)現(xiàn),必須對教材和一些有用的信息進行進一步的整合,才能有效的加以利用,以方便實際操作運用。
2、注意課堂教學(xué)的調(diào)控,靈活把握課堂教學(xué)的進程。
在教學(xué)的實際過程中,有時因預(yù)設(shè)不足,可能會導(dǎo)致教學(xué)任務(wù)不能按計劃完成,那么在運用時就應(yīng)該酌情將教學(xué)內(nèi)容中的一些訓(xùn)練型問題典型化,將其他的題目留待輔導(dǎo)課時再做處理,不要一味貪多,反而不能達到預(yù)期的教學(xué)目標。
3、加強對學(xué)生情感、態(tài)度、價值觀的拓展和滲透。盡管素質(zhì)教育一直是我們追求的教育目標,但在教改中,我個人認為更應(yīng)該注重學(xué)生的情感、態(tài)度、價值觀的拓展和滲透。在新的教育理念當(dāng)中,首先應(yīng)該做做人的教育,其次才是做事以及學(xué)習(xí)的教育。這一點至關(guān)重要。
4、充分發(fā)揮學(xué)生自身作用,使其認識自己和英語課堂的密切關(guān)系??傊?jīng)過近一年來有計劃、有目的的教學(xué)研究,我們對英語課堂的教學(xué)模式已經(jīng)有了一定的認識,從中學(xué)到了不少行之有效的教學(xué)經(jīng)驗。當(dāng)然,一切的革新都是建立在不斷的學(xué)習(xí)和反思的基礎(chǔ)上的,只有不斷的反思并總結(jié)經(jīng)驗、改進不足,才能在有限的課堂教學(xué)時間內(nèi)獲取最大的教學(xué)效果,真正實現(xiàn)有效教學(xué)。
第五篇:學(xué)習(xí)小學(xué)英語教學(xué)設(shè)計之心得
學(xué)習(xí)小學(xué)英語教學(xué)設(shè)計之心得
小學(xué)英語課堂活動的設(shè)計就是英語教師根據(jù)正確的教學(xué)思想和英語教育原理,按照一定的教學(xué)思想和英語教育原理,按照一定的教學(xué)目的和要求,針對具體的教學(xué)對象和教材,對英語教學(xué)的整個程序、具體環(huán)節(jié)及有關(guān)曾面所作出的預(yù)期的行之有效的策劃和設(shè)計。在學(xué)習(xí)《小學(xué)英語教學(xué)活動設(shè)計》這門課程時,自己做了很詳細的筆記,特別是專家布置的作業(yè),自己也是思考了很久才提交的,“功夫不負有心人”,花了近一個月時間完成的作業(yè)取得了理想的成績,獲得了“優(yōu)秀”的等級。雖說在完成作業(yè)時確實花了不少時間和心思,但是在這個過程中自己也得到了很大的收獲。
英語教學(xué)不僅是一門學(xué)科,也是一門藝術(shù),形成英語教學(xué)藝術(shù)特色的重要因素之一就是教學(xué)設(shè)計(instructional planning)。古人說:“凡事預(yù)則立,不預(yù)則廢?!睆娬{(diào)無論做什么事都要預(yù)先謀劃,事前設(shè)計?,F(xiàn)代教學(xué)尤其注重設(shè)計,科學(xué)的教學(xué)設(shè)計,既是體現(xiàn)教育目的性、計劃性、針對性和預(yù)習(xí)性所必需,又是順利實施教學(xué)方案、調(diào)控教學(xué)過程的前提,也是確保教學(xué)效果、提高教學(xué)質(zhì)量的保證。
英語教學(xué)設(shè)計就是英語教師根據(jù)正確的教學(xué)思想和英語教育原理,按照一定的教學(xué)目的和要求,針對具體的教學(xué)對象和教材,對英語教學(xué)的整個程序及其具體環(huán)節(jié)、總體結(jié)構(gòu)及其有關(guān)層面所作出的預(yù)期的行之有效的策劃。它是英語教師教育思想、思維流程和教學(xué)藝術(shù)的體現(xiàn)。眾多的教學(xué)實踐告訴我們,在學(xué)校教學(xué)條件有限的情況下,只要教師有心,同樣可以進行樸素卻生動的有效的教學(xué)設(shè)計;一個教師的基本功的精湛同樣是成就教學(xué)精彩的基本元素,如清爽明了的簡筆畫和教師動聽的歌喉也能使教學(xué)充滿詩意,吸引孩子們的眼球并提升語言能力。
新課程的課堂是具體的,動態(tài)生成的,它不是教師完全預(yù)設(shè)的。所以,我們教師在進行小學(xué)英語教學(xué)設(shè)計時,應(yīng)認真思考以下幾個層面的問題:
觀念層面:是否充分領(lǐng)會現(xiàn)代教育理念和現(xiàn)代教育技術(shù)的核心要素。內(nèi)容層面:教學(xué)設(shè)計是否有明確的問題情景和學(xué)習(xí)路徑。操作層面:是否將學(xué)習(xí)空間最大限度的留給學(xué)生。
綜上所述,以“學(xué)生”為主體的教學(xué)設(shè)計應(yīng)充分重視學(xué)習(xí)者的自主學(xué)習(xí),教師在設(shè)計教學(xué)預(yù)案時,要學(xué)會主動把自己當(dāng)成“魚”,只有這樣學(xué)會了“換位思考”,能夠預(yù)想“魚”的各種感受,才會在觀念上和方法上得到自我提升,也才會真正創(chuàng)造出適合學(xué)生發(fā)展的教育活動。
在實際教學(xué)中,以下幾點英語教學(xué)設(shè)計的技巧,或許對我們的教學(xué)有幫助,可以提高教學(xué)效率。
一、因材設(shè)計
所謂因材設(shè)計,就是能根據(jù)教材內(nèi)容來設(shè)計教學(xué)環(huán)節(jié),確立教學(xué)的重難點。在具體的教學(xué)過程中要始終圍繞這個重點來安排教學(xué)活動,讓活動的每一個環(huán)節(jié)既精彩又有實效。
二、因人設(shè)計
由于學(xué)生之間具有明顯的差異性,底子不一,接受能力也不同。在設(shè)計教學(xué)活動時,教師必須潛心研究各個學(xué)生,設(shè)計出多層次的教學(xué)活動,讓全體學(xué)生都能在原有的基礎(chǔ)上學(xué)有所得、各展其長。
我覺得,在作業(yè)設(shè)計方面尤其應(yīng)該考慮學(xué)生的實際,讓作業(yè)適合不同層次學(xué)生的學(xué)習(xí)能力。第一層,設(shè)計面向成績較差學(xué)生的基礎(chǔ)題;第二層,設(shè)計面向全體學(xué)生的鞏固題;第三層,設(shè)計面向“尖子生”的創(chuàng)新題。
三、因難設(shè)計
小學(xué)生學(xué)習(xí)英語最怕“難學(xué)”,而教師最擔(dān)心“難教”。在“難”字解決之后,教學(xué)中的其他問題馬上會迎刃而解。因此,在英語教學(xué)設(shè)計中,難點的處理尤為重要。處理得當(dāng),有事半功倍之效.以上簡短的語言其實不足以全面概括教學(xué)設(shè)計的方方面面,要做到教學(xué)設(shè)計的科學(xué),全面,還需要我們?nèi)ザ喽嗟挠H身實踐