1.單例模式java
每一個類只能建立一個實例對象編程
Java Singleton模式主要做用是保證在Java應用程序中,一個類Class只有一個實例存在。 使用Singleton的好處還在於能夠節省內存,由於它限制了實例的個數,有利於Java垃圾回收(garbage collection)。併發
好處:ide
第1、控制資源的使用,經過線程同步來控制資源的併發訪問;this
第2、控制實例產生的數量,達到節約資源的目的。線程
第3、做爲通訊媒介使用,也就是數據共享,它能夠在不創建直接關聯的條件下,讓多個不相關的兩個線程或者進程之間實現通訊。code
應用場景:在線統計人數server
public class SingleTon { private SingleTon(){} public static volatile SingleTon instance=null; public static SingleTon getInstance( ){ synchronized (SingleTon.class){ if(instance==null){ instance=new SingleTon(); } } } return instance; } public String getName() { return name; } public void setName(String name) { this.name=name; } public void getInfo( ){ System.out.println("name is "+name); }
public static void main(String[] args) { SingleTon s1 = SingleTon. getInstance( ); s1. setName( "0000" ); SingleTon s2 = SingleTon. getInstance( ); s2. setName( " 1111" ); s1. getInfo( ); s2.getInfo( ); if(s1 == s2){ System.out.println("是一個實例");} else{ System. out. println("不是一個實例"); } }
synchronized 關鍵字,表明這個方法加鎖,對象
至關於無論哪個線程A每次運行到這個方法時,繼承
都要檢查有沒有其它正在用這個方法的線程B(或者C D等),
有的話要等正在使用這個方法的線程B(或者C D)運行完這個方法後再運行此線程A,
沒有的話,直接運行它包括兩種用法:synchronized 方法和 synchronized 塊
2.工廠模式
優勢:
將建立實例的工做與使用實例的工做分開,使用者沒必要關心類對象如何建立,明確了職責。
把初始化實例時的工做放到工廠裏進行,使代碼更容易維護。 更符合面向對象的原則,面向接口編程,而不是面向實現編程。
缺點:
因爲工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。
要新增產品類的時候,就要修改工廠類的代碼,違反了開放封閉原則(對擴展的開放,對修改的關閉)。
簡單工廠模式因爲使用了靜態工廠方法,靜態方法不能被繼承和重寫,會形成工廠角色沒法造成基於繼承的等級結構。
public interface Sender{ public void Send(); }
public class MailSender implements Sender{ @0verride public void Send( ) { System.out.println("this is mailsender!"); }
public class SmsSender implements Sender{ @override public void Send( ) { System.out.println("this is sms sender!"); }
public class SenderFactory{ public Sender produce(String type){ if("mail".equals(type)){ return new MailSender(); }else if("sms".equals(type)){ return new SmsSender(); }else { System.out.println("請輸入正確的類型!"); return null; } //多工廠模式 // public Sender produceMail(){ // return new MailSender(); // } // public Sender produceSms(){ // return new SmsSender(); // } } }
3觀察者模式
簡單地說,觀察者模式定義了一個一對多的依賴關係,讓一個或多個觀察者對象監聽一個主題對象。這樣一來,當被觀察者狀態發生改變時,須要通知相應的觀察者,使這些觀察者對象可以自動更新。例如:GUI中的事件處理機制採用的就是觀察者模式.
//定義被觀察者所具備的接口 public interface Observable { public void register0bserve(Observer observer);//註冊爲一個觀察者 public void remove0bserve(Observer observer);//取消觀察 者 public void notifyobserves( );//通知全部觀察者更新信息 }
import com . example. demo . interfaceTest . observable; import com. example . demo. interfaceTest Observer; gimport java.util.Vector ; public class Cup implements Observable { //被觀察者維護的一個觀察者對象列表 private Vector<observer> vector = new Vector<observer>(); private float price; public Cup(float price) { this.price = price; } public float getPrice() { return price; public void setPrice(float price) { this.price = price; notifyobserves( ); //修改價格時通知觀察者 } @override public void register0bserve(Observer observer) { / /註冊觀察者 vector . add( observer); } @override public void removeObserve(Observer observer) { //取消觀察者 vector . remove(observer); } @override public void notifyObserves() { //實現通知全部的觀察者對象 for (Observer observer:vector){ observer update(price); } }
package com. example. demo .interfaceTest public interface observer { public void update(float price); }
package com. example . demo. test; import com. example. demo. interfaceTestobserver: public class Person implements Observer private String name ; public Person(String name ){ this.name = name ; aoverride public void update(float price) { System. out. println(name+"關注的杯子的價格已更新爲: "+price); } public static void main(String[] args) { Cup cup = new Cup( price: 3000); Person p1 = new Person( name: "老哥」); Person p2 = new Person( name: "小弟」); cup. registerObserve(p1); cup. registerObserve(p2); System. out. println("第1次修改價格"); cup. setPrice(2500); System. out. println( "第2次修改價格" ); cup. setPrice(2000); System. out. println("第3次修改價格"); cup. setPrice(1500); //移除2號觀察者 cup. removeObserve(p2); System. out. println("第4次修改價格」); cup . setPrice(1000); }