全文目錄:
- 開篇語
- 前言
- 1. 單例模式:確保全局只有一個實例
- 1.1 餓漢式單例
- 1.2 懶漢式單例
- 1.3 雙重檢查鎖定(DCL)
- 2. 工廠模式:簡化對象創建
- 2.1 簡單工廠模式
- 2.2 工廠方法模式
- 2.3 抽象工廠模式
- 3. 其他設計模式
- 3.1 觀察者模式
- 3.2 策略模式
- 3.3 適配器模式
- 4. 結語
- 文末
開篇語
哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云/阿里云/華為云/51CTO;歡迎大家常來逛逛
??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。
??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。
小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!
前言
設計模式,是面向對象設計中的“秘籍”,幫助我們解決程序設計中遇到的一些常見問題。它們是基于多年開發經驗總結出來的解決方案,不僅能提升代碼的復用性、可維護性和擴展性,還能使我們在開發過程中避免重復造輪子。在Java中,設計模式的應用更是幾乎無處不在,幫助我們優化架構、提升開發效率。
今天我們將重點講解幾個常見的設計模式,具體包括單例模式、工廠模式,以及其他一些經典的設計模式,如觀察者模式、策略模式和適配器模式。在這個過程中,我們不僅要知道“為什么”使用這些模式,更要知道“如何”使用它們。
1. 單例模式:確保全局只有一個實例
單例模式是一個非常常見的設計模式,它的核心思想是:保證一個類只有一個實例,并提供一個全局的訪問點。這個模式特別適用于控制資源的使用,比如數據庫連接池、線程池等。單例模式不僅能避免多個實例造成的資源浪費,還能控制類的實例化過程,確保一致性。
1.1 餓漢式單例
餓漢式單例是在類加載時就創建單例對象,因此它是線程安全的,且實現簡單。但是,這種方式缺點在于,不管是否需要該實例,類加載時就會進行實例化。
public class Singleton {// 在類加載時初始化實例private static final Singleton INSTANCE = new Singleton();// 私有化構造函數private Singleton() {}// 提供公共方法獲取實例public static Singleton getInstance() {return INSTANCE;}
}
這種方式的缺點是:如果你只在某些情況下需要這個單例實例,它依然會在類加載時就創建好,這可能造成性能上的浪費。不過,它在高并發場景下是線程安全的。
1.2 懶漢式單例
懶漢式單例則是在需要的時候才實例化對象,這樣可以避免不必要的資源浪費。然而,懶漢式單例在并發場景下存在問題,可能導致多線程下創建多個實例。
public class Singleton {// 聲明靜態變量,但不初始化private static Singleton instance;// 私有化構造函數private Singleton() {}// 提供公共方法獲取實例public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
上面的代碼在多線程環境下會出現問題,如果多個線程同時進入getInstance()
方法,可能會導致多個實例的創建。為了避免這種情況,我們使用sychronized
進行同步。但是,性能上并不是最優。
1.3 雙重檢查鎖定(DCL)
雙重檢查鎖定(Double-Checked Locking)是為了優化懶漢式單例的性能問題。它通過兩次檢查instance
是否為空,第一次檢查是在同步塊外部,第二次檢查則是在同步塊內部。這種方式既能保證線程安全,又能避免每次都進行同步,提升了性能。
public class Singleton {private static volatile Singleton instance;// 私有化構造函數private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
volatile
關鍵字用于保證instance
變量在多線程環境下的可見性,確保所有線程都能看到最新的instance
值。雙重檢查鎖定提供了較高的性能,是懶漢式單例的優化版本。
2. 工廠模式:簡化對象創建
工廠模式是一種創建對象的設計模式,目的是為了將對象的創建過程與使用過程分離,從而提高代碼的可維護性和擴展性。工廠模式的基本思想是定義一個用于創建對象的接口,由具體的工廠類實現該接口。
2.1 簡單工廠模式
簡單工廠模式又叫靜態工廠方法,它通過一個工廠類來決定哪個類的實例應該被創建。工廠類根據不同的條件(如傳入的參數)來返回不同的對象。
public class AnimalFactory {public static Animal createAnimal(String type) {if ("Dog".equals(type)) {return new Dog();} else if ("Cat".equals(type)) {return new Cat();}return null;}
}
在這個簡單的工廠模式中,AnimalFactory
類根據傳入的type
來決定返回哪個具體的動物實例。該模式的缺點是,如果新增了一個Animal
子類,我們需要修改工廠方法,違背了開閉原則。
2.2 工廠方法模式
工廠方法模式是對簡單工廠模式的進一步抽象。每一個具體的工廠都繼承自一個抽象工廠類,通過不同的工廠來創建對象。這樣一來,當需要新增一個產品時,我們只需要新增一個工廠類,而不需要修改原有代碼,符合開閉原則。
public abstract class AnimalFactory {public abstract Animal createAnimal();
}public class DogFactory extends AnimalFactory {@Overridepublic Animal createAnimal() {return new Dog();}
}public class CatFactory extends AnimalFactory {@Overridepublic Animal createAnimal() {return new Cat();}
}
2.3 抽象工廠模式
抽象工廠模式進一步擴展了工廠方法模式,它不僅能生產一個產品類別的對象,還能生產多個相關的對象。例如,一個“動物工廠”可能不僅僅生產狗、貓,還可以生產它們的相關對象,如“狗的玩具”或“貓的食品”。
public interface AnimalFactory {Animal createAnimal();Toy createToy();
}public class DogFactory implements AnimalFactory {public Animal createAnimal() {return new Dog();}public Toy createToy() {return new DogToy();}
}
通過這種方式,我們不僅可以創建不同類型的動物,還能創建與動物相關的產品。抽象工廠模式使得我們能夠在多個產品族之間進行切換,且能夠擴展更多產品類別而無需修改現有代碼。
3. 其他設計模式
3.1 觀察者模式
觀察者模式是一種行為型設計模式,主要用于對象間的一對多關系,當一個對象的狀態發生改變時,所有依賴它的對象都會得到通知并自動更新。觀察者模式廣泛應用于事件驅動系統,比如GUI系統中的事件監聽,或者消息推送等場景。
public interface Observer {void update(String message);
}public class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received: " + message);}
}public class Subject {private List<Observer> observers = new ArrayList<>();public void addObserver(Observer observer) {observers.add(observer);}public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}
3.2 策略模式
策略模式是一種行為型設計模式,定義了一系列算法,并將每一個算法封裝起來,使它們可以互相替換。策略模式讓算法的變化獨立于使用算法的客戶。
public interface PaymentStrategy {void pay();
}public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay() {System.out.println("Paying with Credit Card");}
}public class PayPalPayment implements PaymentStrategy {@Overridepublic void pay() {System.out.println("Paying with PayPal");}
}
3.3 適配器模式
適配器模式是一種結構型設計模式,允許我們將一個類的接口轉換成客戶希望的另一個接口,使得原本由于接口不兼容而不能一起工作的類可以一起工作。
public interface MediaPlayer {void play(String fileName);
}public class AudioPlayer implements MediaPlayer {@Overridepublic void play(String fileName) {System.out.println("Playing audio: " + fileName);}
}public interface AdvancedMediaPlayer {void playMP4(String fileName);
}public class MP4Player implements AdvancedMediaPlayer {@Overridepublic void playMP4(String fileName) {System.out.println("Playing MP4: " + fileName);}
}public class MediaAdapter implements MediaPlayer {private AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(AdvancedMediaPlayer advancedMusicPlayer) {this.advancedMusicPlayer = advancedMusicPlayer;}@Overridepublic void play(String fileName) {advancedMusicPlayer.playMP4(fileName);}
}
4. 結語
設計模式的應用,可以幫助我們更好地管理復雜的系統結構,提升代碼的靈活性、可維護性和可擴展性。在實際開發中,根據具體需求合理選用不同的設計模式,能讓我們的代碼更加優雅和高效。希望今天的內容能幫助你對這些經典設計模式有更深入的理解,并在實際開發中游刃有余地運用它們!
… …
文末
好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。
… …
學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!
wished for you successed !!!
??若喜歡我,就請關注我叭。
??若對您有用,就請點贊叭。
??若有疑問,就請評論留言告訴我叭。
版權聲明:本文由作者原創,轉載請注明出處,謝謝支持!