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