一.設計模式的作用
設計模式是軟件從業人員長期總結出來用于解決特定問題的通用性框架,它提高了代碼的可維護性、可擴展性、可讀性以及復用性。
二.設計模式
1.工廠模式
工廠模式提供了創建對象的接口,而無需制定創建對象的具體類,工廠類封裝了具體類的創建過程,客戶端無需知道具體實現類只需要知道工廠類,通過工廠類來創建具體實現的類。
1).優缺點
優點:
(1).松耦合:無需知道子類具體創建過程,只需要關注工廠類。
(2).可擴展性:擴展性高,如果想增加一個產品,只需要增加子類對應的工廠類即可。
缺點:
每增加一個產品,就需要增加一個具體的類和對應的工廠類,可維護性并不高,增加了代碼復雜性。
2).應用場景
使用數據庫連接工廠類連接不同的數據庫,比如達夢、崖山等
3).類圖
4).具體實現過程
(1).創建一個接口
(2).創建實體類
(3).創建工廠類
(4).根據類型調用工廠類連接數據庫
2.抽象工廠模式
抽象工廠模式是圍繞一個超級工廠創建其他工廠,此超級工廠又稱為其他工廠的工廠,抽象工廠模式提供了一個接口,通過此接口及其具體實現類,可以將對象的創建與客戶端代碼分離,從而實現系統的松耦合。
1).優缺點
優點:
(1).保證產品族一致性:抽象工廠模式創建的產品族類都是同一類產品,客戶端使用此族類的產品的時候也都是使用此族類的產品。
(2).實現松耦合:客戶端代碼只需要通過抽象工廠接口創建產品無需知道產品具體實現代碼。
(3).有利于擴展:增加新的產品族類,只需要添加新的具體工廠和產品類即可。
缺點:
每次增加產品族類都要添加一個此族類的工廠代碼,還要添加此工廠的具體實現代碼,系統和代碼復雜性變高。
2).應用場景
比如格力和美的電器都會生產很多產品,空調、洗衣機、冰箱、熱水器等,這些都是產品族類。
3).組成
抽象工廠:一般為接口,聲明了創建產品對象的方法;
具體工廠:實現了抽象工廠,用于創建產品對象的具體類;
抽象產品:一般為接口或抽象類,聲明實現產品的公共方法,具體產品必須要實現此方法;
具體產品:實現了抽象產品;
4).類圖
5).具體實現
(1).創建一個接口
(2).創建接口的實體類
(3).創建抽象工廠類
(4).創建抽象工廠類的擴展實現類
(5).創建生成器
(5).使用
3.單例模式
單例模式確保一個類只有一個實例,單例模式還需要提供一個全局訪問方法
1).優缺點
優點:
(1).避免一個全局使用的類頻繁地創建與銷毀
(2).保證了全局狀態的一致性
缺點:
(1).過度使用單例可能導致全局狀態不可控
2).應用場景
獲取打印機去打印圖紙,可以使用單例模式去創建打印機;IP訪問次數計數等;
3).具體實現
public class Singleton {//實例私有private static Singleton instance;//構造方法私有private Singleton() {}//創建實例的方法公開,如果沒創建就創建實例,如果創建了就不在創建public static Singleton getInstance() {if (instance == null) {// 如果實例為空,則創建一個新實例instance = new Singleton();}return instance;}
}
4.建造者模式
建造者模式提供了一種允許用戶逐步設置各種屬性來構建對象的方式,很多參數對于一個對象來說可能是可選的,開發者無需傳遞所有參數去創建對象,對于可選的參數如果用戶未傳就要去除,所以我們就可以將構建復雜組件的步驟與運用組件構建對象分離,使用builder模式建立。
1).優缺點
優點:
(1).分離構建過程和表示,使得構建過程更加靈活
(2).隱藏具體構建細節,提高封裝性
(3).提供代碼復用性
缺點:
(1).增加代碼復雜性,對于步驟簡單的對象沒必要使用此模式
2).應用場景
需要生成的對象具有復雜的內部結構,創建者創建對象的步驟和參數過多而且需要更加靈活
3).具體實現
比如一個用戶,姓名、電話、性別是必選的,但是住址、年齡、郵箱是可選的,有些用戶可能輸入年齡,有些用戶可能給了地址等;這里通過UserBuilder去實現根據不同的參數創建User對象;
(1).創建User類和UserBuilder類型
public class User {//名稱 必填private String name;//性別 必填private String sex;//電話 必填private String phone;//年齡 可選private Integer age;//住址 可選private String address;//住址 可選private String email;public User(UserBuilder userBuilder) {this.name = userBuilder.name;this.sex = userBuilder.sex;this.phone = userBuilder.phone;this.age = userBuilder.age;this.address = userBuilder.address;this.email = userBuilder.email;}public static UserBuilder builder(String name, String sex, String phone){return new UserBuilder(name,sex,phone);}public static class UserBuilder {//名稱private String name;//性別private String sex;//電話private String phone;//年齡private Integer age;//住址private String address;//住址private String email;//構造器public UserBuilder(String name, String sex, String phone) {this.name = name;this.sex = sex;this.phone = phone;}public UserBuilder age(Integer age) {this.age = age;return this;}public UserBuilder address(String address) {this.address = address;return this;}public UserBuilder email(String email) {this.email = email;return this;}public User build(){return new User(this);}}
}
(2).使用UserBuilder創建user
5.原型模式
原型模式通過復制現有對象來創建新對象,也就是拷貝現有的實例對象來創建對象,而不需重頭創建對象。
1).優缺點
優點:
(1).提高創建對象的效率,減少創建對象成本
(2).無需知道構造函數內部邏輯,降低了耦合度
缺點:
(1).對于對象內部的引用有循環接口或者對象內部有不支持序列化的引用對象就不支持拷貝
2).應用場景
當類初始化比較復雜、比較耗時耗性能、需要獲取權限等的時候需要使用原型模式
3).深拷貝和淺拷貝
(1).淺拷貝:拷貝一個對象后,基本數據類型的變量會重新創建,引用類型指向的還是原對象所指向的
(2).深拷貝:拷貝一個對象后,基本數據類型還有引用對象都是重新創建的,比如clone方法就是深拷貝
4).具體實現
(1).實體類繼承Cloneable ,復寫clone方法
public class User implements Cloneable {//名稱 必填private String name;//性別 必填private String sex;//電話 必填private String phone;//年齡 可選private Integer age;//住址 可選private String address;//住址 可選private String email;@Overridepublic User clone() {try {return (User) super.clone();} catch (CloneNotSupportedException e) {return null;}}
(2).使用
6.適配器模式
通過一個適配器類將一個接口轉換成另一個接口,使得兩個不兼容的對象能夠協同工作,從而消除不兼容問題
1).優缺點
優點:
(1).將不同的系統、庫、組件適配在一起,而無需修改太多的代碼,提高代碼的復用性
(2).擁有更高的靈活性
缺點:
(1).過多的適配器會導致代碼混亂降低維護性
2).類圖
Mp4PlayerImpl專門用于播放MP4文件,Mp3PlayerImpl專門用于播放MP3,如果Mp4PlayerImpl想播放MP3文件那么就需要一個適配器Mp4PlayerAdapter去適配Mp3PlayerImpl的接口,去代理播放MP3文件。
3).具體實現
(1).實現MP4播放功能
(2).實現MP3播放功能
(3).實現MP4的適配器
(4).使用