java設(shè)計模式

??????? 設(shè)計模式在我們學習完java基礎(chǔ)之后厅须,應(yīng)該都學習過枉氮,那時候覺的為什么要把很簡單的東西搞得那么復(fù)雜碰纬。我所理解的“簡單”就是一把鑰匙開一把鎖的模式,目的僅僅是著眼于解決現(xiàn)在的問題崭倘,而設(shè)計模式的“復(fù)雜”就在于它是要構(gòu)造一個“萬能鑰匙”翼岁,目的是提出一種對所有鎖的開鎖方案。后來隨著軟件開發(fā)經(jīng)驗的增加才開始明白我們所看到的“復(fù)雜”恰恰就是設(shè)計模式的精髓所在司光。

?????? 工作好幾年后琅坡,突然發(fā)覺已經(jīng)好多年沒有自己在項目代碼中寫設(shè)計模式的代碼,因為目前項目都是框架化的東西飘庄,spring已經(jīng)把很多設(shè)計模式封裝好脑蠕,例如 單例模式购撼、工廠模式跪削、代理模式谴仙、適配器模式等,普通程序員只需要按照spring的api調(diào)用即可碾盐,根本不需要去關(guān)注內(nèi)部是怎樣實現(xiàn)的晃跺。今天就來重新的回味一下設(shè)計模式。

在真正理解設(shè)計模式之前我一直在編寫“簡單”的代碼.

這個“簡單”不是功能的簡單毫玖,而是設(shè)計的簡單掀虎。簡單的設(shè)計意味著缺少靈活性,代碼很鋼硬付枫,只在這個項目里有用烹玉,拿到其它的項目中就是垃圾,我將其稱之為“一次性代碼”阐滩。

設(shè)計原則:(重要)

1.

邏輯代碼獨立到單獨的方法中二打,注重封裝性--易讀,易復(fù)用掂榔。

不要在一個方法中继效,寫下上百行的邏輯代碼。把各小邏輯代碼獨立出來装获,寫于其它方法中瑞信,易讀其可重復(fù)調(diào)用。

2.

寫類穴豫,寫方法凡简,寫功能時,應(yīng)考慮其移植性精肃,復(fù)用性:防止一次性代碼潘鲫!

是否可以拿到其它同類事物中應(yīng)該?是否可以拿到其它系統(tǒng)中應(yīng)該肋杖?

3.

熟練運用繼承的思想:

找出應(yīng)用中相同之處溉仑,且不容易發(fā)生變化的東西,把它們抽取到抽象類中状植,讓子類去繼承它們浊竟;

繼承的思想,也方便將自己的邏輯建立于別人的成果之上津畸。如ImageField extends JTextField振定;

熟練運用接口的思想:

找出應(yīng)用中可能需要變化之處,把它們獨立出來肉拓,不要和那些不需要變化的代碼混在一起后频。

設(shè)計模式中最簡單的單例模式,下面是單例模式:

1 單例模式

單態(tài)模式與共享模式的區(qū)別:

單態(tài)模式與共享模式都是讓類的實例是唯一的。

但單態(tài)模式的實現(xiàn)方式是:

在類的內(nèi)部.即在構(gòu)造方法中卑惜,或靜態(tài)的getInstace方法中膏执,進行判斷,若實例存在露久,則直接返回更米,不進行創(chuàng)建;

共享模式的實現(xiàn)方式是:

每次要用到此實例時毫痕,先去此hashtable中獲取征峦,若獲取為空,則生成實例消请,且將類的實例放在一人hashtable中栏笆,若獲取不為空,則直接用此實例臊泰。

1.1竖伯、懶漢式,線程不安全

是否 Lazy 初始化:是

是否多線程安全:否

實現(xiàn)難度:易

描述:這種方式是最基本的實現(xiàn)方式因宇,這種實現(xiàn)最大的問題就是不支持多線程七婴。因為沒有加鎖 synchronized,所以嚴格意義上它并不算單例模式察滑。

這種方式 lazy loading 很明顯打厘,不要求線程安全,在多線程不能正常工作贺辰。

代碼實例:

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

1.2户盯、懶漢式,線程安全

是否 Lazy 初始化:是

是否多線程安全:是

實現(xiàn)難度:易

描述:這種方式具備很好的 lazy loading饲化,能夠在多線程中很好的工作莽鸭,但是,效率很低吃靠,99% 情況下不需要同步硫眨。

優(yōu)點:第一次調(diào)用才初始化,避免內(nèi)存浪費巢块。

缺點:必須加鎖 synchronized 才能保證單例礁阁,但加鎖會影響效率。

getInstance() 的性能對應(yīng)用程序不是很關(guān)鍵(該方法使用不太頻繁)族奢。

代碼實例:

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

1.3姥闭、餓漢式

是否 Lazy 初始化:否

是否多線程安全:是

實現(xiàn)難度:易

描述:這種方式比較常用,但容易產(chǎn)生垃圾對象越走。

優(yōu)點:沒有加鎖棚品,執(zhí)行效率會提高。

缺點:類加載時就初始化,浪費內(nèi)存铜跑。

它基于 classloder 機制避免了多線程的同步問題门怪,不過,instance 在類裝載時就實例化疼进,雖然導(dǎo)致類裝載的原因有很多種,在單例模式中大多數(shù)都是調(diào)用 getInstance 方法秧廉, 但是也不能確定有其他的方式(或者其他的靜態(tài)方法)導(dǎo)致類裝載伞广,這時候初始化 instance 顯然沒有達到 lazy loading 的效果。

代碼實例:

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton (){}

public static Singleton getInstance() {

return instance;

}

}

2.工廠模式

工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一疼电。這種類型的設(shè)計模式屬于創(chuàng)建型模式嚼锄,它提供了一種創(chuàng)建對象的最佳方式。

在工廠模式中蔽豺,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯区丑,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象。

定義一個創(chuàng)建對象的接口修陡,讓其子類自己決定實例化哪一個工廠類沧侥,工廠模式使其創(chuàng)建過程延遲到子類進行。

主要解決:主要解決接口選擇的問題魄鸦。

何時使用:我們明確地計劃不同條件下創(chuàng)建不同實例時宴杀。

如何解決:讓其子類實現(xiàn)工廠接口,返回的也是一個抽象的產(chǎn)品拾因。

關(guān)鍵代碼:創(chuàng)建過程在其子類執(zhí)行旺罢。

應(yīng)用實例: 1、您需要一輛汽車绢记,可以直接從工廠里面提貨扁达,而不用去管這輛汽車是怎么做出來的,以及這個汽車里面的具體實現(xiàn)蠢熄。 2跪解、Hibernate 換數(shù)據(jù)庫只需換方言和驅(qū)動就可以。

優(yōu)點: 1签孔、一個調(diào)用者想創(chuàng)建一個對象惠遏,只要知道其名稱就可以了。 2骏啰、擴展性高节吮,如果想增加一個產(chǎn)品,只要擴展一個工廠類就可以判耕。 3透绩、屏蔽產(chǎn)品的具體實現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。

缺點:每次增加一個產(chǎn)品時帚豪,都需要增加一個具體類和對象實現(xiàn)工廠碳竟,使得系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度狸臣,同時也增加了系統(tǒng)具體類的依賴莹桅。這并不是什么好事。

使用場景: 1烛亦、日志記錄器:記錄可能記錄到本地硬盤诈泼、系統(tǒng)事件、遠程服務(wù)器等煤禽,用戶可以選擇記錄日志到什么地方铐达。 2、數(shù)據(jù)庫訪問檬果,當用戶不知道最后系統(tǒng)采用哪一類數(shù)據(jù)庫瓮孙,以及數(shù)據(jù)庫可能有變化時。 3选脊、設(shè)計一個連接服務(wù)器的框架杭抠,需要三個協(xié)議,"POP3"恳啥、"IMAP"祈争、"HTTP",可以把這三個作為產(chǎn)品類角寸,共同實現(xiàn)一個接口菩混。

步驟 1

創(chuàng)建一個接口。

Shape.java

public interface Shape {

void draw();

}

步驟 2

創(chuàng)建實現(xiàn)接口的實體類扁藕。

Rectangle.java

public class Rectangle implements Shape {

@Override

public void draw() {

System.out.println("Inside Rectangle::draw() method.");

}

}

Square.java

public class Square implements Shape {

@Override

public void draw() {

System.out.println("Inside Square::draw() method.");

}

}

Circle.java

public class Circle implements Shape {

@Override

public void draw() {

System.out.println("Inside Circle::draw() method.");

}

}

步驟 3

創(chuàng)建一個工廠沮峡,生成基于給定信息的實體類的對象。

ShapeFactory.java

public class ShapeFactory {

//使用 getShape 方法獲取形狀類型的對象

public Shape getShape(String shapeType){

if(shapeType == null){

return null;

}

if(shapeType.equalsIgnoreCase("CIRCLE")){

return new Circle();

} else if(shapeType.equalsIgnoreCase("RECTANGLE")){

return new Rectangle();

} else if(shapeType.equalsIgnoreCase("SQUARE")){

return new Square();

}

return null;

}

}

步驟 4

使用該工廠亿柑,通過傳遞類型信息來獲取實體類的對象邢疙。

FactoryPatternDemo.java

public class FactoryPatternDemo {

public static void main(String[] args) {

ShapeFactory shapeFactory = new ShapeFactory();

//獲取 Circle 的對象,并調(diào)用它的 draw 方法

Shape shape1 = shapeFactory.getShape("CIRCLE");

//調(diào)用 Circle 的 draw 方法

shape1.draw();

//獲取 Rectangle 的對象望薄,并調(diào)用它的 draw 方法

Shape shape2 = shapeFactory.getShape("RECTANGLE");

//調(diào)用 Rectangle 的 draw 方法

shape2.draw();

//獲取 Square 的對象疟游,并調(diào)用它的 draw 方法

Shape shape3 = shapeFactory.getShape("SQUARE");

//調(diào)用 Square 的 draw 方法

shape3.draw();

}

}

設(shè)計模式中 單例模式、工廠模式 是最簡單的2種模式痕支,在這先講解一下這2種模式颁虐,后期會更新其他常用的模式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卧须,一起剝皮案震驚了整個濱河市另绩,隨后出現(xiàn)的幾起案子儒陨,更是在濱河造成了極大的恐慌,老刑警劉巖笋籽,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦漠,死亡現(xiàn)場離奇詭異,居然都是意外死亡车海,警方通過查閱死者的電腦和手機笛园,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侍芝,“玉大人研铆,你說我怎么就攤上這事〗叻罚” “怎么了蚜印?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵莺禁,是天一觀的道長留量。 經(jīng)常有香客問我,道長哟冬,這世上最難降的妖魔是什么楼熄? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮浩峡,結(jié)果婚禮上可岂,老公的妹妹穿的比我還像新娘。我一直安慰自己翰灾,他們只是感情好缕粹,可當我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纸淮,像睡著了一般平斩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咽块,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天绘面,我揣著相機與錄音,去河邊找鬼侈沪。 笑死揭璃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的亭罪。 我是一名探鬼主播瘦馍,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼应役!你這毒婦竟也來了扣墩?” 一聲冷哼從身側(cè)響起哲银,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呻惕,沒想到半個月后荆责,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡亚脆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年做院,在試婚紗的時候發(fā)現(xiàn)自己被綠了濒持。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片键耕。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡柑营,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出官套,到底是詐尸還是另有隱情酒奶,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布奶赔,位于F島的核電站,受9級特大地震影響另伍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绞旅,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一摆尝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧因悲,春花似錦堕汞、人聲如沸囤捻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誊涯。三九已至,卻和暖如春暴构,著一層夾襖步出監(jiān)牢的瞬間跪呈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工苹支, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留误阻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓寻定,卻偏偏與公主長得像精耐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卦停,可洞房花燭夜當晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容