簡單工廠模式
工廠方法模式
抽象工廠模式
觀察者模式(發布-訂閱模式)
介面卡模式
裝飾器模式
狀態模式
外觀模式
開閉原則:對修改關閉,對擴充套件開發.我們軟體開發應當遵守這一原則.
確保乙個類在系統中僅有乙個例項,自行例項化並向這個系統提供這個例項.
要將建構函式設為private,防止外部呼叫,還有提供乙個getinstance方法返回例項.
使用場景:
1、要求生產唯一序列號。
2、web 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先快取起來。
3、建立的乙個物件需要消耗的資源過多,比如 i/o 與資料庫的連線等。
實現方式:
在第一次呼叫時例項化,防止記憶體浪費
public
class
instance
public
synchronized instance getinstance()
return instance;
}}
沒有加鎖,執行效率會提高,但浪費記憶體.
public
class
instance
public instance getinstance()
}
將建立物件的事交給工廠類來做,使物件的建立和使用分離
工廠中建立物件的方法通常為static
public
class
factorymode
}abstract
class
product
class
producta
extends
product
}class
productb
extends
product
}class
factory
else
if(name.
equals
("b"))
return product;
}}
但是如果要增加product的子類就要修改factory的**,違背了開閉原則
將工廠抽象出來,子工廠負責建立物件,不同的子工廠建立不同的物件.將子工廠的相同方法抽象出來,也可以理解為定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面.
public
class
factorymethod
}abstract
class
factory
class
factorya
extends
factory
}class
factoryb
extends
factory
}abstract
class
product
class
producta
extends
product
}class
productb
extends
product
}
對所有工廠抽象成乙個超級工廠
public
class
abstractfactory
}abstract
class
supe***ctory
class
factorya
extends
supe***ctory
@override
public computer getcomputer()
}class
factoryb
extends
supe***ctory
@override
public computer getcomputer()
}class
macfactory
extends
supe***ctory
@override
public computer getcomputer()
}class
xiaomifactory
extends
supe***ctory
@override
public computer getcomputer()
}abstract
class
product
abstract
class
computer
class
producta
extends
product
}class
productb
extends
product
}class
macextends
computer
}class
xiaomi
extends
computer
}
定義物件間的一種一對多的依賴關係,當乙個物件(發布者)的狀態發生改變時,所有依賴於它的物件(觀察者)}都得到通知並被自動更新。
public
class
subject
public
void
setstate
(int state)
public
void
attach
(observer observer)
public
void
notifyallobservers()
}public
static
void
main
(string[
] args)
}
觀察者:
public
abstract
class
observer
class
observer1
extends
observer
@override
public
void
update()
}class
observer2
extends
observer
@override
public
void
update()
}
為乙個類擴充套件新功能,使類能和介面一起工作
public
class
carpublic
static
void
main
(string[
] args)
}inte***ce
flyclass
caradapter
implements
fly@override
public
void
flyinsky()
public
void
runandfly()
}
為乙個類新增新的功能而不改變原有結構
注意與介面卡模式的區別,介面卡模式是通過實現介面,是本地方法與介面中的方法能一起工作.裝飾器模式直接新增方法來擴充套件功能
public
class
carpublic
static
void
main
(string[
] args)
}class
cardecorator
public
void
fly(
)}
類狀態改變其行為也跟隨改變
需要乙個抽象的狀態類state和環境類context
state類封裝抽象的要改變的方法,不同狀態子類給予不同方法的實現
public
class
statemode
}abstract
class
state
class
fullgasstate
extends
state
}class
lessgasstate
extends
state
}class
carcontext
public
void
run(
)}
隱藏系統的複雜性,並向客戶端提供乙個客戶端可以訪問系統的介面。
用乙個類將需要的物件封裝成private,提供乙個public方法給外部呼叫.
設計模式筆記
1 類繼承與介面繼承的比較。物件的類與物件的型別的比較 乙個物件的類定義了物件怎麼樣實現的,同時也定義物件內部狀態和操作的實現。但是物件的型別只與他的介面有關,藉口即物件能響應的請求的集合。乙個物件可以有多個型別,不同的類物件可以有相同的型別。理解類繼承和介面繼承之間的差別也十分重要。類繼承根據乙個...
設計模式筆記
設計模式是一種真理,我們在沒有學習過設計模式時都會或多或少的與他不謀而合,但是學習過後我們可以把他從經驗性的東西提煉為理論性的,並且反過來再指導實踐,這應該就是我們學習並使用設計模式的初衷,這好比是政經中的價值規律,任何人都知道東西如果少了而需求大,它 馬上就漲,而反過來 就賤,可是學過政經後就可以...
設計模式筆記
設計模式精解p136,第11章 專家如何進行設計 alexander提到 從片段開始設計不是乙個好的設計方法。即將預先成型的部分新增在一起是無法得到優秀的軟體設計的。但還是可以得到可以工作的軟體的,只是大部分時候難於修改或擴充套件 我的觀點 軟體或者軟體系統都是由 功能模組 和這些 模組之間的聯絡 ...