摘要:在設(shè)計模式中,所有的設(shè)計模式都遵循這一原則。其實就是說在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設(shè)計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。
這是劉意老師的JAVA基礎(chǔ)教程的筆記
講的賊好,附上傳送門
傳智風清揚-超全面的Java基礎(chǔ)
一、面向?qū)ο笏枷朐O(shè)計原則 1.單一職責原則其實就是開發(fā)人員經(jīng)常說的”高內(nèi)聚,低耦合”,也就是說,每個類應(yīng)該只有一個職責,對外只能提供一種功能,而引起類變化的原因應(yīng)該只有一個。在設(shè)計模式中,所有的設(shè)計模式都遵循這一原則。
2.開閉原則核心思想是:一個對象對擴展開放,對修改關(guān)閉。
其實開閉原則的意思就是:對類的改動是通過增加代碼進行的,而不是修改現(xiàn)有代碼。
也就是說軟件開發(fā)人員一旦寫出了可以運行的代碼,就不應(yīng)該去改動它,而是要保證它能一直運行下去,如何能夠做到這一點呢?這就需要借助于抽象和多態(tài),即把可能變化的內(nèi)容抽象出來,從而使抽象的部分是相對穩(wěn)定的,而具體的實現(xiàn)則是可以改變和擴展的。
核心思想:在任何父類出現(xiàn)的地方都可以用它的子類來替代。
其實就是說:同一個繼承體系中的對象應(yīng)該有共同的行為特征。
核心思想:要依賴于抽象,不要依賴于具體實現(xiàn)。
其實就是說:在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。為了實現(xiàn)這一原則,就要求我們在編程的時候針對抽象類或者接口編程,而不是針對具體實現(xiàn)編程。
核心思想:不應(yīng)該強迫程序依賴它們不需要使用的方法。
其實就是說:一個接口不需要提供太多的行為,一個接口應(yīng)該只提供一種對外的功能,不應(yīng)該把所有的操作都封裝到一個接口中。
6.迪米特原則
核心思想:一個對象應(yīng)當對其他對象盡可能少的了解
其實就是說:降低各個對象之間的耦合,提高系統(tǒng)的可維護性。在模塊之間應(yīng)該只通過接口編程,而不理會模塊的內(nèi)部工作原理,它可以使各個模塊耦合度降到最低,促進軟件的復(fù)用
1.1.概念
設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
設(shè)計模式不是一種方法和技術(shù),而是一種思想
設(shè)計模式和具體的語言無關(guān),學(xué)習(xí)設(shè)計模式就是要建立面向?qū)ο蟮乃枷耄M可能的面向接口編程,低耦合,高內(nèi)聚,使設(shè)計的程序可復(fù)用
學(xué)習(xí)設(shè)計模式能夠促進對面向?qū)ο笏枷氲睦斫猓粗嗳弧K鼈兿噍o相成
1.2.要素
名字 必須有一個簡單,有意義的名字
問題 描述在何時使用模式
解決方案 描述設(shè)計的組成部分以及如何解決問題
效果 描述模式的效果以及優(yōu)缺點
1.3.分類
創(chuàng)建型模式 對象的創(chuàng)建:簡單工廠模式,工廠方法模式,抽象工廠模式,建造者模式,原型模式,單例模式。(6個)
結(jié)構(gòu)型模式 對象的組成(結(jié)構(gòu)):外觀模式、適配器模式、代理模式、裝飾模式、橋接模式、組合模式、享元模式。(7個)
行為型模式 對象的行為:模版方法模式、觀察者模式、狀態(tài)模式、職責鏈模式、命令模式、訪問者模式、策略模式、備忘錄模式、迭代器模式、解釋器模式。(10個)
2.創(chuàng)建型模式具體使用2.1.簡單工廠模式
又叫靜態(tài)工廠方法模式,它定義一個具體的工廠類負責創(chuàng)建一些類的實例
優(yōu)點
客戶端不需要在負責對象的創(chuàng)建,從而明確了各個類的職責
缺點
這個靜態(tài)工廠類負責所有對象的創(chuàng)建,如果有新的對象增加,或者某些對象的創(chuàng)建方式不同,就需要不斷的修改工廠類,不利于后期的維護
public class Demo { public static void main(String[] args) { } } class AnimalFactory { private AnimalFactory() { } static Animal creatAnimal(String type) { if ("dog".equals(type)) { return new Dog(); } if ("cat".equals(type)) return new Cat(); return null; } } abstract class Animal { abstract void eat(); } class Dog extends Animal { @Override void eat() { System.out.println("dog eats meat"); } } class Cat extends Animal { @Override void eat() { System.out.println("cat eats fish"); } }
2.2.工廠方法模式
工廠方法模式中抽象工廠類負責定義創(chuàng)建對象的接口,具體對象的創(chuàng)建工作由繼承抽象工廠的具體類實現(xiàn)。
優(yōu)點
客戶端不需要在負責對象的創(chuàng)建,從而明確了各個類的職責,如果有新的對象增加,只需要增加一個具體的類和具體的工廠類即可,不影響已有的代碼,后期維護容易,增強了系統(tǒng)的擴展性
缺點
需要額外的編寫代碼,增加了工作量
public class Demo { public static void main(String[] args) { Factory df=new DogFactory(); Animal a=df.creatAnimal(); a.eat(); Factory cf=new CatFactory(); Animal b=cf.creatAnimal(); b.eat(); } } interface Factory{ Animal creatAnimal(); } class DogFactory implements Factory{ @Override public Animal creatAnimal() { return new Dog(); } } class CatFactory implements Factory{ @Override public Animal creatAnimal() { return new Cat(); } } abstract class Animal { abstract void eat(); } class Dog extends Animal { @Override void eat() { System.out.println("dog eats meat"); } } class Cat extends Animal { @Override void eat() { System.out.println("cat eats fish"); } }
2.3.單例設(shè)計模式概述
單例模式就是要確保類在內(nèi)存中只有一個對象,該實例必須自動創(chuàng)建,并且對外提供。優(yōu)點
在系統(tǒng)內(nèi)存中只存在一個對象,因此可以節(jié)約系統(tǒng)資源,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能。
缺點
沒有抽象層,因此擴展很難。
職責過重,在一定程序上違背了單一職責
饑餓型
在類加載的時候就已經(jīng)創(chuàng)建好對象
public class Demo { public static void main(String[] args) { Student s1=Student.getStudent(); Student s2=Student.getStudent(); System.out.println(s1==s2); } } class Student { private Student() {//讓外界不能創(chuàng)建這個類的對象 } private static Student s = new Student();//為了不讓外界直接訪問修改這個值,所以要加private static Student getStudent() { return s; } }
懶惰式
用的時候才去創(chuàng)建對象
可能產(chǎn)生線程安全問題
public class Demo { public static void main(String[] args) { Teacher t1=Teacher.getTeacher(); Teacher t2=Teacher.getTeacher(); System.out.println(t1==t2); } } class Teacher { private Teacher() { } private static Teacher t = null; static Teacher getTeacher() { if (t == null) t = new Teacher(); return t; } }
單例模式的應(yīng)用---Runtime類
public class Demo { public static void main(String[] args) { Runtime run=Runtime.getRuntime(); try { run.exec("calc"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67510.html
摘要:一個進程如果有多條執(zhí)行路徑,則稱為多線程程序。這可能拋出在當前線程中。考慮多線程的數(shù)據(jù)安全問題是否是多線程環(huán)境。當前線程必須擁有此對象監(jiān)視器。此方法導(dǎo)致當前線程稱之為將其自身放置在對象的等待集中,然后放棄此對象上的所有同步要求。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎(chǔ) 一、線程的引入 1.多線程概述 進程 a.正在運行的程序,是...
摘要:分類根類加載器也被稱為引導(dǎo)類加載器,負責核心類的加載比如等。要想解剖一個類必須先要獲取到該類的字節(jié)碼文件對象。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風清揚-超全面的Java基礎(chǔ) 一、類的加載 1.類初始化的時機 創(chuàng)建類的實例訪問類的靜態(tài)變量,或者為靜態(tài)變量賦值調(diào)用類的靜態(tài)方法使用反射方式來強制創(chuàng)建某個類或接口對應(yīng)的java.lang.Class對象初始化某個類...
摘要:但是模塊化當中,無法掃描只有模塊中可以使用有兩種解決方案定義一個專門的資源模塊,并使用提供的接口,實現(xiàn)它,并將這個實現(xiàn)注冊為服務(wù)。有兩種方式使用或包名,包名模塊名使用運行時動態(tài)。 模塊設(shè)計的原則: 1、防止出現(xiàn)編譯時循環(huán)依賴(主要是編譯器不支持),但運行時是允許循環(huán)依賴的,比如GUI應(yīng)用2、明確模塊的邊界 幾種模塊設(shè)計: API模塊,聚合模塊(比如java.base) 可選依賴 兩種方...
摘要:開頭正式開啟我入職的里程,現(xiàn)在已是工作了一個星期了,這個星期算是我入職的過渡期,算是知道了學(xué)校生活和工作的差距了,總之,盡快習(xí)慣這種生活吧。當時是看的廖雪峰的博客自己也用做爬蟲寫過幾篇博客,不過有些是在前人的基礎(chǔ)上寫的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開頭 2017.08.21 正式開啟我...
摘要:基礎(chǔ)問題的的性能及原理之區(qū)別詳解備忘筆記深入理解流水線抽象關(guān)鍵字修飾符知識點總結(jié)必看篇中的關(guān)鍵字解析回調(diào)機制解讀抽象類與三大特征時間和時間戳的相互轉(zhuǎn)換為什么要使用內(nèi)部類對象鎖和類鎖的區(qū)別,,優(yōu)缺點及比較提高篇八詳解內(nèi)部類單例模式和 Java基礎(chǔ)問題 String的+的性能及原理 java之yield(),sleep(),wait()區(qū)別詳解-備忘筆記 深入理解Java Stream流水...
閱讀 2074·2021-11-15 17:57
閱讀 739·2021-11-11 16:54
閱讀 2589·2021-09-27 13:58
閱讀 4067·2021-09-06 15:00
閱讀 950·2021-09-04 16:45
閱讀 3505·2019-08-30 15:56
閱讀 1784·2019-08-30 15:53
閱讀 1604·2019-08-30 14:12