更新時間:2022-12-20 12:04:17 來源:動力節點 瀏覽1350次
Java有很多種模式,以下的是一些總結的模式。
1.單例模式 (實現方式 私有構造器 + 私有靜態本身的實例 + 共有實例方法返回本身的實例), 需要判斷是否已經生成過實例)一個類只允許其有一個實例化對象 在并發程序中用的可能比較多, 涉及線程安全, 我自己知道的是Spring 依賴注入, 在容器中的Bean一般都是單例的.
public class Singelton { // 最平凡的實現方式
private volatile static Singelton singelton;
public static Singelton getInstance(){
if(singelton == null) {
synchronized {
if(singelton == null) {
singelton = new Singelton();
return singelton;
}
}
}
}
}
2.工廠模式(一個創建型設計模式) 有很多實現的例子 比如說很多帶有*BeanFactrory的類都是工廠模式的體現 他通過形參等 生成不同的對象 LoggerFactory BeanFactory 等. 其實就是通過工廠的方式, 返回某個接口不同的實例, 其實就是可以根據客戶要求的返回她想要的產品..
工廠模式分為三種:
第一種: 簡單工廠(靜態工廠) 有一個工廠類擁有一個靜態的方法, 用來產生產品實例, 通過傳遞參數的不同來區分生成哪個產品實例.
第二種: 工廠方法 : 這個是用來解決簡單工廠存在的問題 比如: 增加一個產品簡單工廠需要對工廠類代碼進行修改, 增加一個判斷條件, 這樣就增加了代碼的復雜程度, 工廠方法為了解決這個問題, 通過多態的方式來實現不同的工廠類來生產不同的產品. 即會有一個工廠接口, 通過實現工廠接口的方式實現新的工廠類, 來代替修改工廠類代碼, 這樣會使得代碼耦合度降低.
第三種: 抽象工廠 為產品分類, 將縱向的產品實現類, 橫向化, 就是組成更大的產品工廠 具體實現如圖:(手畫工廠圖) 用來生產復雜的產品.
3.觀察者模式 用于一對多 或者是 一對一 關系中 在一中有什么改動 會導致和他有關系的多(也就是觀察者們也發生變動)
Redis 實現異步消息隊列 有一種實現方式叫: 發布訂閱者模式 類似但是 調度方式不一樣 觀察者模式由發布者調度 而 另一種模式不是 他有單獨的調度中心
例子:
public interface Subject {
public void attach(Observer o);
public void detach(Observer o);
public void notice();
}
interface Observer{
public void update();
}
class Student implements Observer{
String teacherPhone = "";
Teacher teacher ;
public Student(String phone,Teacher t){
teacher = t;
teacherPhone = phone;
}
@Override
public void update() {
teacherPhone = teacher.getPhone();
}
public void show(){
System.out.println(teacherPhone);
}
}
class Teacher implements Subject{
private String phone;
private ArrayList<Observer> students;
public Teacher(){
phone = "";
students = new ArrayList<Observer>();
}
@Override
public void attach(Observer o) {
students.add(o);
}
@Override
public void detach(Observer o) {
students.remove(o);
}
@Override
public void notice() {
for(Observer o:students){
o.update();
}
}
public String getPhone(){
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
notice();
}
}
Test:
public static void main(String[] args) {
Teacher teacher = new Teacher();
Student s = new Student("",teacher);
Student s1 = new Student("",teacher);
teacher.attach(s);
teacher.attach(s1);
teacher.setPhone("13215646");//核心在這個set方法上 他的變動導致很多都發生了改變
s.show();
s1.show();
}
4.外觀模式(門面模式) Facade Pattern
這個感覺是最簡單的 他通過一個門面類 將具體操作隱藏在方法中 客戶只需要調用方法 不用知道具體的實現 這樣就很好
(說的個更加科學一點就是, 這個模式的作用就是實現客戶端和子系統的解耦, 用戶在調用客戶端接口的時候我們可以將它具體調用的操作隱藏起來, 只需要給他提供一個門面接口, 這樣就可以使得調用更加簡單)
public void Solution(){
Analyze a = new Analyze();//這三個類的具體實現不知道 不過用戶只要對調用方法 自動都會產生結果
Think t = new Think();
Finally f = new Finally();
a.Analyze();
t.Think();
f.Finally();
}
public class Test {
public static void main(String[] args) {
Problem p = new Problem();
p.Solution();
}
}
5.組合模式 解釋一下這個模式是什么, 首先他是用來解決樹形對象模型的(這個說的有一點不是很確切, 我感覺組合模式是用來解決類似有多種不同的對象, 但是他們之間還有一定的相似性 類似于這種問題就可以用組合模式來解決, 組合模式可以將他們抽象到一個Component), 就是例如文件系統這種樹形的結構. 他的方式是通過將葉子節點(文件), 非葉子結點(文件夾) , 抽象成一個component類或者是接口, 然后葉子節點和非葉子結點, 分別實現一下這個類, 然后通過重寫方法的形式來實現樹形遍歷
還分為兩種: 透明組合模式 安全組合模式
6.命令模式
先上圖:(傳統的命令模式 可能都不是這么用)
這個模式可以類比于開關, 有不同的功能選項, 當你按不同的按鈕的時候, 會有不同的物品反應你的命令(暫時理解就是這個含義)
對于上圖來說, 一個命令模式需要一個Invoker調用者, 也就是發出命令的人, 它關聯了一個command對象(或者是一系列command對象), 然后我們需要具體的command實現類, 用來調用Handler(某個功能具體的實現類), 這個圖還少了個模塊就是我們應該將Handler抽象成接口, 這樣的話, 如果添加刪除具體的Handler也可以減少我們修改之前的代碼. 然后我們的邏輯關系是, 我們的實現類接口會關聯一個Handler, 通過set方法set具體的Handler實現類之后, 調用具體的功能模塊.................(這是傳統的)
但是現在的命令名模式很多情況下都不是直接將Handler和Command 耦合起來, 因為我們要滿足設計的高內聚弱耦合的原則, 所以 -> 演變出了一個命令隊列.
7.裝飾模式 (分為透明裝飾模式和半透明裝飾模式)
然后簡單的說一下這個模式是什么, 這個模式是為了為被修飾的類添加一個方法, 其實就是裝飾一下一個類, 使其具有其他功能, 具體的實現方式是: 首先我們需要一個被裝飾的抽象構建Component(其有一個需要被修飾的方法), 然后我們需要一個抽象裝飾器類Decorator, 實現我們的需要被修飾的抽象構建, 然后與其關聯一下. 最后我們需要一個具體的裝飾器類ConcreteDecorator, 它實現我們的抽象裝飾器類, 然后加入我們要加入的 方法, 這樣我們就可以為我們的具體實現類set一個ConcreteComponent, 之后就可以調用被修飾的方法.
8.代理模式 這個模式較難 單獨建立了一個文檔 詳見 java學習/代理模式
9.原型模式 這個模式就是獲取原型的一個克隆對象, 克隆對象和原型不能是同一個對象的引用. 在java中可以調用基類Object 的clone() 方法, 但是要重寫這個方法必須實現Cloneable
這個模式有兩種級別:
淺克隆 : 就是上頭說到的那種情況, 實現一個Cloneable 接口 這個只能克隆基本類型, 但是對于引用類型 他只能克隆引用類型的地址 所以說引用類型的對象克隆之后兩個實例指向的還是一個對象
深克隆 : 這個是通過實現一個Serializable 接口來實現 , 把對象實例放到流里, 然后再取回來, 這樣就可以獲得一個新的克隆實例
10.建造者模式
建造者模式類似于抽象工廠模式, 抽象工廠是將不同的產品進行組合, 組合成新產品, 他是用來生產復雜產品(也就是類)的. 類似的, 建造者模式是用來產生復雜對象的, 在這里兩者的核心區別就是, 建造者模式使用來生產復雜對象的, 他把一個對象的不同屬性的建造抽象化, 也就是說一個對象的屬性的值是通過調用建造函數獲取的, 相對的抽象工廠是用來講不同種的產品(也就是類) 組合起來生成新的產品的過程, 他的組裝對象是類. 而建造者模式組裝的是屬性
首先他分為, 要生產的對象 Actor , 建造者(AbstrackBuilder, *Builder) , 控制者
抽象建造者有一個Actor類型的屬性, 并且有為這個Actor 的各個屬性賦值的函數, 具體建造者繼承抽象建造者, 然后實現具體的建造函數, 最后控制者需要一個具體建造者作為參數, 控制者分別調用具體建造者的建造函數, 然后獲取這個建造出來的Actor 也就是說我可以選擇不調用某個函數, 這樣就很靈活
11.適配器模式
這個模式的含義我的理解是, 我們有一個(目標/目的)抽象類的兩個方法, 但是在某個地方已經有實現了的現成的方法, 那么我們想要不用自己再重新實現一遍這兩個一樣的方法有兩種辦法 1.把之前實現的代碼copy過去, 2. 就是寫一個目標抽象類的適配器,
對于第二種方法也就是實現這個抽象類然后提供一下這兩個方法的實現, 然后這兩個方法的實現是通過關聯已經實現過這兩個方法的類然后調用他們的方法來實現, 這樣就避免了copy代碼從而增加代碼長度, 而且冗余度高的問題.
然后適配器模式還分為對象適配器模式和類適配器模式, 對象適配器模式是通過關聯的方式來調用適配者的方法, 但是類適配器模式是通過繼承的方式, 由于java語言單繼承的特性, 其實這個類適配器模式很少被使用,
適配器模式有一種雙向適配器模式, 這個其實就是可以雙向適配. 適配者是雙方的.還有一種叫缺省適配器, 缺省適配器的最大的特點就是適配器類是一個抽象的, 他不用實現目標接口的所有方法, 而是可以只實現幾個.
12.橋接模式
廢話不多說先來上個圖
來解釋一下這個橋接模式, 首先他的作用是分離一個實體中兩種或者多種維度的抽象, 把他們抽象成抽象類 -> 關聯 -> 抽象接口的模式 這樣就可以了 要增添新的類型, 只需要在他對應的維度下創建一個對應的具體實現類, 然后就可以實現復雜功能的解耦.
13.享元模式 (不是特別常用)
這個模式的作用就是, 實現一個享元工廠, 將一些具有相同功能的對象集中起來, 減少對象的數量, 降低系統因為對象冗余導致的內存消耗, 最典型的例子運用了享元模式的就是String這個對象. 每次創建新對象的時候他總是要先在常量池中查找是不是已經有了相同字符串的引用如果有了的話就不用在創建一個新的對象了, 只要把之前那個字符串的引用返回即可
14.職責鏈模式
責任鏈模式是什么尼? 其實責任鏈模式就是對于一系列的處理, 請求需要在一個鏈上依次傳遞. (類似于jsp的過濾器和Spring的攔截器)
責任鏈模式分為純的責任鏈模式和不純的責任鏈模式.
以上就是關于“Java設計模式詳解”的介紹,如果大家對此比較感興趣,想了解更多相關知識,不妨來關注一下本站的Java設計模式技術文檔,里面還有更豐富的知識等著大家去學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習