做單本小說(shuō)網(wǎng)站怎么樣線上宣傳方案
迪米特法則:Law of Demeter, LoD, 最少知識(shí)原則LKP
如果兩個(gè)軟件實(shí)體無(wú)須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用,可以通過(guò)第三方轉(zhuǎn)發(fā)該調(diào)用。其目的是降低類之間的耦合度,提高模塊的相對(duì)獨(dú)立性。
所以,在運(yùn)用迪米特法則時(shí)要注意以下 6 點(diǎn)。
- 在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類。類與類之間的耦合越弱,就越有利于實(shí)現(xiàn)可復(fù)用的目標(biāo)。
- 在類的結(jié)構(gòu)設(shè)計(jì)上,盡量降低類成員的訪問(wèn)權(quán)限。
- 在類的設(shè)計(jì)上,優(yōu)先考慮將一個(gè)類設(shè)置成不變類。
- 在對(duì)其他類的引用上,將引用其他對(duì)象的次數(shù)降到最低。
- 不暴露類的屬性成員,而應(yīng)該提供相應(yīng)的訪問(wèn)器(set 和 get 方法)。
- 謹(jǐn)慎使用序列化(Serializable)功能。
創(chuàng)建型模式:工廠模式、抽象工廠模式、生成器模式、原型模式、單例模式
結(jié)構(gòu)型模式:適配器、橋接、組合、裝飾器、外觀、享元、代理
單件模式 Singleton Pattern
要求一個(gè)類有且僅有一個(gè)實(shí)例,并提供了一個(gè)全局的訪問(wèn)點(diǎn),在同一時(shí)刻只能被一個(gè)線程所訪問(wèn)。
特點(diǎn):
- 單件類只能有一個(gè)實(shí)例;
- 單件類必須自身創(chuàng)建唯一實(shí)例;
- 單件類必須給所有其他對(duì)象提供唯一實(shí)例。
https://www.cnblogs.com/libingql/archive/2012/12/01/2797532.html
實(shí)現(xiàn)要點(diǎn):
- 單件類有一個(gè)私有的無(wú)參構(gòu)造函數(shù),防止被其他類實(shí)例化;
- 單件類不能被繼承;
- 單件類使用靜態(tài)變量保存單實(shí)例的引用;
- 單件類使用公有靜態(tài)方法獲取單一實(shí)例的引用,如果實(shí)例為null則創(chuàng)建一個(gè)。
實(shí)現(xiàn)方式
- 使用類的內(nèi)部類(線程安全)推薦
public class Singleton_04 {private static class SingletonHolder {private static Singleton_04 instance = new Singleton_04();}private Singleton_04() {}public static Singleton_04 getInstance() {return SingletonHolder.instance;}
}
- 雙重鎖校驗(yàn)(線程安全)
public class Singleton_05 {private static Singleton_05 instance;private Singleton_05() {}public static Singleton_05 getInstance(){if(null != instance) return instance;synchronized (Singleton_05.class){if (null == instance){instance = new Singleton_05();}}return instance;}
}
雙重鎖的方式是方法級(jí)鎖的優(yōu)化,減少了部分獲取實(shí)例的耗時(shí)。
-
CAS AtomicReference(線程安全)
-
枚舉單例
public enum Singleton_07 {INSTANCE;public void test(){System.out.println("hi~");}
}
// 使用:
Singleton_07.INSTANCE.test();
工廠模式
舉例
impl是各自的實(shí)現(xiàn)都繼承了ICommodity接口。StoreFactory中通過(guò)參數(shù)控制調(diào)用不同實(shí)例。
優(yōu)點(diǎn):
- 避免創(chuàng)建者與具體的產(chǎn)品邏輯耦合;
- 滿足單一職責(zé),每個(gè)業(yè)務(wù)邏輯的實(shí)現(xiàn)都在自己所屬的類中完成;
- 滿足開(kāi)閉原則,無(wú)需更改使用調(diào)用方就可以在程序中引入新的產(chǎn)品類型
缺點(diǎn):
可能會(huì)有非常多的子類 → 應(yīng)使用其他模式進(jìn)行優(yōu)化
抽象工廠模式
抽象工廠是一個(gè)中心工廠,可以創(chuàng)建其他工廠的模式。
抽象工廠模式要解決的問(wèn)題是:在一個(gè)產(chǎn)品族,存在多個(gè)不同類型的產(chǎn)品(Redis集群、操作系統(tǒng))的情況下,如何選擇接口的問(wèn)題。
比如原有一個(gè)單機(jī)Redis,隨著業(yè)務(wù)的發(fā)展,有了更健壯的Redis集群A和B(分別提供不同的接口和方法),需要把Redis升級(jí)但不能影響目前系統(tǒng)的運(yùn)行。
建設(shè)者模式
將多個(gè)簡(jiǎn)單對(duì)象一步步地組裝構(gòu)建出一個(gè)復(fù)雜對(duì)象。
將一個(gè)復(fù)雜的構(gòu)建與其表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。(因?yàn)槊總€(gè)組裝中可以選用不同的原料、元件)
舉例:修改前
Matter.java主要保證所有的裝修材料可以按照統(tǒng)一標(biāo)準(zhǔn)進(jìn)行獲取。其他類都實(shí)現(xiàn)了Matter接口。這樣在使用時(shí)需要很多個(gè)if else。修改后:
IMenu是接口類,DecorationPackageMenu實(shí)現(xiàn)了IMenu接口,是填充器,
Builder建造者類具體的各種組裝。
DecorationPackageMenu類里有一個(gè)List list,一個(gè)price,一個(gè)area,一個(gè)grade(裝修等級(jí))
,所以添加matter(組裝)的同時(shí)可以計(jì)算價(jià)格和面積啥的,也就可以打印單子了。(以往這些是放在各個(gè)類的)。
Builder類只是調(diào)用DecorationPackageMenu類中的方法實(shí)現(xiàn)組裝而已。
何時(shí)選擇建造者模式?一些基本物料不變,而其組合經(jīng)常變化時(shí)。
原型模式
原型模式主要解決的問(wèn)題是創(chuàng)建重復(fù)對(duì)象,而這種對(duì)象內(nèi)容本身比較復(fù)雜,生成過(guò)程可能從庫(kù)或RPC接口中獲取數(shù)據(jù)的耗時(shí)較長(zhǎng),因此采用克隆的方式節(jié)省時(shí)間。
舉例:
上機(jī)考試抽題服務(wù)。有問(wèn)答題和選擇題,未來(lái)可能有更多題型。但是題目不能每次都從庫(kù)或者更遠(yuǎn)的地方抽取,因?yàn)槿绻麆?chuàng)建對(duì)象很多的話,會(huì)非常耗時(shí)。
QuestionBank(實(shí)現(xiàn)了Cloneable)負(fù)責(zé)將各個(gè)題目進(jìn)行組裝最終輸出試卷,主要包括append()和clone(),clone()里不止復(fù)制,更有亂序功能。Controller就是初始化,以及提供createPaper()。
Cloneable是標(biāo)記型的接口,它們內(nèi)部都沒(méi)有方法和屬性,實(shí)現(xiàn) Cloneable來(lái)表示該對(duì)象能被克隆,能使用Object.clone()方法。如果沒(méi)有實(shí)現(xiàn) Cloneable的類對(duì)象調(diào)用clone()就會(huì)拋出CloneNotSupportedException。
優(yōu)點(diǎn):
便于通過(guò)克隆方式創(chuàng)建復(fù)雜對(duì)象,可以避免重復(fù)做初始化操作,不需要與類中所屬的其他類耦合。
缺點(diǎn):
如果對(duì)象中包括了循環(huán)引用的克隆,以及類中深度使用對(duì)象的克隆,會(huì)使此模式變麻煩。