一、單例
1. 創建
- 餓漢式
package basic;public class ESingleton {// 先私有化靜態實例private static ESingleton eSingleton = new ESingleton();// 私有化構造方法,防止外部實例化private ESingleton(){};// 提供全局訪問方法public static ESingleton geteSingleton(){return eSingleton;}}
- 懶漢式
package basic;public class LazySingleton {// 創建私有靜態實例,nullprivate static LazySingleton lazySingleton = null;// 私有構造方法,防止外部實例化private LazySingleton(){};// 提供全局訪問點,使用同步方法解決線程安全問題public static synchronized LazySingleton getLazySingleton(){if (lazySingleton == null){lazySingleton = new LazySingleton();}return lazySingleton;}
}
2. 區別
1. 餓漢式是在實例化私有靜態類加載時就創建,不管是否需要用;
2. 懶漢式是在實例加載時聲明但是木有創建,只有外部調用get需要用的時候才會創建需要注意線程安全
二、觀察者模式
1. 創建及概念
- 概念
1. 觀察者模式是1對多,其中1發生變化后會自動通知,也能感知到變化
2. 例如:假設有三個人,小美(女,22),小王和小李。小美很漂亮,小王和小李是兩個程序猿,時刻關注著小美的一舉一動。有一天,小美說了一句:“誰來陪我打游戲啊。”這句話被小王和小李聽到了,結果樂壞了,蹭蹭蹭,沒一會兒,小王就沖到小美家門口了,在這里,小美是被觀察者,小王和小李是觀察者,被觀察者發出一條信息,然后觀察者們進行相應的處理
- 創建
- 寫一個接口用于獲取消息
package basic.pattern;public interface Person {// 用于獲取消息void getMessage(String s);
}
- ?聲明3個人的類
package basic.pattern;public class Li implements Person {private static String name = "Xiao Li";public Li(){};@Overridepublic void getMessage(String s) {System.out.println(name + "收到消息" + s);}
}
??
package basic.pattern;public class Wang implements Person{private static String name = "Xiao Wang";public Wang(){};@Overridepublic void getMessage(String s){System.out.println(name + "收到消息: " + s);}
}
package basic.pattern;import java.util.ArrayList;
import java.util.List;public class Mei {List<Person> list = new ArrayList<Person>();public Mei(){};public void addPerson(Person person){list.add(person);}//遍歷list,把自己的通知發送給所有暗戀自己的人public void notifyPerson(){for (Person person:list){//主要這一步,調用對應人的getMessage方法,達到通知的目的person.getMessage("Come here!");}}}
- 測試
package basic.pattern;public class TestObserverPattern {public static void main(String[] args) {Mei mei = new Mei(); //執行這個的時候已經執行了List<Person> list = new ArrayList<Person>();Li li = new Li();Wang wang = new Wang();mei.addPerson(li);mei.addPerson(wang);mei.notifyPerson();}
}
輸出:
Xiao Li收到消息Come here!
Xiao Wang收到消息: Come here!
三、適配器模式
1. 概念
將兩種完全不同的事物聯系到一起,就像現實生活中的變壓器。假設一個手機充電器需要的電壓是20V,但是正常的電壓是220V,這時候就需要一個變壓器,將220V的電壓轉換成20V的電壓,這樣,變壓器就將20V的電壓和手機聯系起來了。
2. 創建
package basic.pattern;public class AdapterTest {public static void main(String[] args) {System.out.println();Phone phone = new Phone();VoltageAdapter adapter = new VoltageAdapter();phone.setAdapter(adapter);phone.charge();}// 手機類static class Phone {public static final int V = 220; // 原始常量private VoltageAdapter adapter;// 充電public void charge() {adapter.changeVoltage();}public void setAdapter(VoltageAdapter adapter) {this.adapter = adapter;}}// 變壓器類static class VoltageAdapter {public void changeVoltage() {System.out.println("正在充電");System.out.println("原始電壓是:" + Phone.V + "V");System.out.println("變壓后電壓是:" + (Phone.V - 200) + "V");}}
}
說明:
1. Phone(手機類):這個類表示手機。在充電時,手機需要一個適配器來轉換電壓。
V 是手機需要的電壓,初始值為 220V。
charge() 方法是手機充電的方法,調用適配器的方法來改變電壓。2.VoltageAdapter(變壓器類):這個類表示電壓適配器,用于將原始電壓轉換成適合手機的電壓。
changeVoltage() 方法改變電壓,輸出充電信息,原始電壓和轉換后電壓。3. AdapterTest(適配器測試類):main 方法創建了一個手機和一個電壓適配器的實例。
phone.setAdapter(adapter) 將適配器設置給手機。
phone.charge() 調用手機的充電方法,實際上會調用適配器的電壓轉換方法。
四、工廠模式
1. 簡介
工廠模式(Factory Pattern)是一種創建型設計模式,它提供了一種創建對象的方式,
將對象的創建與使用分離。工廠模式通過使用一個共同的接口來創建不同類型的對象,
使得客戶端代碼不需要直接依賴于具體類的實例化。
說白了就是把創建對象和使用分離,降低耦合
封裝了對象的創建過程,客戶端只需要調用工廠方法,而不需要關心對象的具體創建細節。
降低了客戶端和具體類之間的耦合,使得代碼更加靈活和可維護。
2. 上代碼
創建Car的接口,實名有哪些方法
package basic.pattern;public interface Car {public void run();public void stop();
}
package basic.pattern;class Benz implements Car{@Overridepublic void run() {System.out.println("Benz is running");}@Overridepublic void stop() {System.out.println("Benz is stopping");}
}class Ford implements Car{@Overridepublic void run() {System.out.println("Ford is running");}@Overridepublic void stop() {System.out.println("Ford is stopping");}
}class Factory{public static Car getCarInstance(String carType){Car c = null;if (carType.equals("Benz")){c = new Benz();}if (carType.equals("Ford")){c = new Ford();}return c;}
}class Test{public static void main(String[] args) {Car c = Factory.getCarInstance("Benz");if(c != null){c.run();c.stop();}else {System.out.println("造不了這種汽車。。。");}}}
未完待續~~~~