須要在一個統一的地方建立對象。java
public class BMW320{ public BMW320(){ System.out.print("製造-->BMW320"); } } public class BMW320{ public BMW320(){ System.out.print("製造-->BMW320"); } } public class Customer{ public static void main(String[] args){ BMW320 bmw320 = new BMW320(); BMW320 bmw523 = new BMW320(); } }
//產品類 abstract class BMW { public BMW(){ } } public class BMW320 extends BMW { public BMW320() { System.out.println("製造-->BMW320"); } } public class BMW523 extends BMW{ public BMW523(){ System.out.println("製造-->BMW523"); } } //工廠類 public class Factory{ public BMW createBmw(int type){ switch(type){ case 320: return new BMW320(); case 523: return new BMW523(); default: break; } return null; } } //客戶類 public class Customer{ public static void main(String[] args){ Factory factory = new Factory(); BMW bmw320 = factory.createBmw(320); BMW bmw523 = factory.createBmw(523); } }
java
中由一個具體類實現。簡單含義:工廠上面又多了個工廠。算法
⼯⼚⽅法模式去掉了簡單⼯⼚模式中⼯⼚⽅法的靜態屬性,使得它能夠被⼦類繼承。這樣在簡單⼯⼚模式⾥,集中在⼯⼚⽅法上的壓⼒,能夠由⼯⼚⽅法模式⾥不一樣的⼯⼚⼦類來分擔。code
1)抽象⼯⼚(工廠上面又抽象了一個工廠)⻆⾊: 這是⼯⼚⽅法模式的核⼼,它與應⽤程序⽆關。是具體⼯⼚⻆⾊必須實現的接⼝或者必須繼承的⽗類。在JAVA中它由抽象類或者接⼝來實現。對象
2)具體⼯⼚⻆⾊:它含有和具體業務邏輯有關的代碼。由應⽤程序調⽤以建立對應的具體產品的對 象。繼承
3)抽象產品⻆⾊:它是具體產品繼承的⽗類或者是實現的接⼝。在JAVA中⼀般有抽象類或者接⼝來實 現。接口
4)具體產品⻆⾊:具體⼯⼚⻆⾊所建立的對象就是此⻆⾊的實例。在JAVA中由具體的類來實現。 (開閉原則)當有新的產品產⽣時,只要按照抽象產品⻆⾊、抽象⼯⼚⻆⾊提供的合同來⽣成,那麼 就能夠被客戶使⽤,⽽沒必要去修改任何已有 的代碼。產品
定義:定義⼀組算法,將每⼀個算法封裝起來,從⽽使它們能夠相互切換。it
特色:class
1)⼀組算法,那就是不一樣的策略。程序
2)這組算法都實現了相同的接⼝或者繼承相同的抽象類,因此能夠相互切換。
策略模式涉及到的⻆⾊有三個:
封裝⻆⾊:上層訪問策略的⼊⼝,它持有抽象策略⻆⾊的引⽤。
抽象策略⻆⾊:提供接⼝或者抽象類,定義策略組必須擁有的⽅法和屬性。
- 具體策略⻆⾊:實現抽象策略,定義具體的算法邏輯。
策略模式的優勢
(1)策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了⼀個算法或⾏爲族。恰當使 ⽤繼承能夠把公共的代碼移到⽗類⾥⾯,從⽽避免代碼重複。
(2)使⽤策略模式能夠避免使⽤多重條件(if-else)語句。多重條件語句不易維護,它把採起哪⼀種算法或採起哪⼀種⾏爲的邏輯與算法或⾏爲的邏輯混合在⼀起,通通列在⼀個多重條件語句⾥⾯,⽐使⽤繼 承的辦法還要原始和落後。
策略模式的缺點
(1)客戶端必須知道全部的策略類,並⾃⾏決定使⽤哪⼀個策略類。這就意味着客戶端必須理解這些 算法的區別,以便適時選擇恰當的算法類。換⾔之,策略模式只適⽤於客戶端知道算法或⾏爲的狀況。
(2)因爲策略模式把每一個具體的策略實現都單獨封裝成爲類,若是備選的策略不少的話,那麼對象的數⽬就會很可觀。