工廠模式
- 意圖:定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。
- 主要解決:主要解決接口選擇的問題。
- 何時使用:我們明確地計劃不同條件下創建不同實例時。
- 如何解決:讓其子類實現工廠接口,返回的也是一個抽象的產品。
- 關鍵代碼:創建過程在其子類執行。
- 實現
定義一個接口:
public interface Shape {
void draw();
}然后定義子類實現這個接口,如長方形:
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}-
接著寫工廠類,傳入類型,利用不同的子類生成不同的實例,如:
public class ShapeFactory {//使用 getShape 方法獲取形狀類型的對象 public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
抽象工廠模式
- 意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
- 主要解決:主要解決接口選擇的問題。
- 何時使用:系統的產品有多于一個的產品族,而系統只消費其中某一族的產品。
- 如何解決:在一個產品族里面,定義多個產品。
- 關鍵代碼:在一個工廠里聚合多個同類產品。
- 實現:在工廠模式的基礎上,多個抽象工廠類,依據需求,實現抽象類中不懂的工廠實例
public abstract class AbstractFactory {
abstract Color getColor(String color);
abstract Shape getShape(String shape) ;
}
單例模式
- 意圖:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
- 主要解決:一個全局使用的類頻繁地創建與銷毀。
- 何時使用:當您想控制實例數目,節省系統資源的時候。
- 如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則創建。
- 關鍵代碼:構造函數是私有的。
原型模式
- 意圖:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
- 主要解決:在運行期建立和刪除原型。
- 何時使用:
- 1、當一個系統應該獨立于它的產品創建,構成和表示時。
- 2、當要實例化的類是在運行時刻指定時,例如,通過動態裝載。
- 3、為了避免創建一個與產品類層次平行的工廠類層次時。
- 4、當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。
- 如何解決:利用已有的一個原型對象,快速地生成和原型對象一樣的實例。
適配器模式
- 意圖:將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
- 如何解決:繼承或依賴(推薦)。
- 關鍵代碼:適配器繼承或依賴已有的對象,實現想要的目標接口。
代理模式
- 意圖:為其他對象提供一種代理以控制對這個對象的訪問。
- 何時使用:想在訪問一個類時做一些控制。
- 如何解決:增加中間層。
- 關鍵代碼:實現與被代理類組合。分別實現兩個父類的子類,一個是具有真實功能的子類,另一個作為代理類,并且利用這個代理類來生成請一個子類的對象,最后利用這個對象來調用真實功能子類的方法。
觀察者模式
- 意圖:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
- 主要解決:一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。
- 何時使用:一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
- 如何解決:使用面向對象技術,可以將這種依賴關系弱化。
- 關鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們。
狀態模式
- 意圖:允許對象在內部狀態發生改變時改變它的行為,對象看起來好像修改了它的類。
- 主要解決:對象的行為依賴于它的狀態(屬性),并且可以根據它的狀態改變而改變它的相關行為。
- 何時使用:代碼中包含大量與對象狀態有關的條件語句。
- 如何解決:將各種具體的狀態類抽象出來。
- 關鍵代碼:通常命令模式的接口中只有一個方法,而狀態模式的接口中有一個或者多個方法。另外,狀態模式的實現類的方法,一般返回值,或者是改變實例變量的值。也就是說,狀態模式一般和對象的狀態有關。實現類的方法有不同的功能,覆蓋接口中的方法。狀態模式和命令模式一樣,也可以用于消除 if...else 等條件選擇語句。
策略模式
- 意圖:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。
- 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。
- 何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。
- 如何解決:將這些算法封裝成一個一個的類,任意地替換。
- 關鍵代碼:實現同一個接口。調用時,傳入不同的策略子類實例,從而實現不同的策略。
訪問者模式
- 意圖:主要將數據結構與數據操作分離。
- 主要解決:穩定的數據結構和易變的操作耦合問題。
- 何時使用:需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,使用訪問者模式將這些封裝到類中。
- 如何解決:在被訪問的類里面加一個對外提供接待訪問者的接口。
- 關鍵代碼:在數據基礎類里面有一個方法接受訪問者,將自身引用傳入訪問者。
MVC模式
MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用于應用程序的分層開發。
- Model(模型) - 模型代表一個存取數據的對象或 JAVA POJO。它也可以帶有邏輯,在數據變化時更新控制器。
- View(視圖) - 視圖代表模型包含的數據的可視化。
- Controller(控制器) - 控制器作用于模型和視圖上。它控制數據流向模型對象,并在數據變化時更新視圖。它使視圖與模型分離開。