實現了建立者和調用者分離。編程
工廠模式核心/本質:設計模式
實例化對象不在使用new,而是用工廠方法代替。ide
將選擇實現類,建立對象統一管理和控制,從而實現調用者和咱們實現類解耦測試
工廠模式詳細分類spa
實現以汽車爲例設計
1 //汽車接口
2 public interface Car { 3 void carName(); 4 } 5
6 //三個實現類
7 public class Audi implements Car { 8 @Override 9 public void carName() { 10 System.out.println("I`m Audi Car"); 11 } 12 } 13
14 public class Benz implements Car { 15 @Override 16 public void carName() { 17 System.out.println("I`m Benz Car"); 18 } 19 } 20
21 public class BMW implements Car { 22 @Override 23 public void carName() { 24 System.out.println("I`m BMW Car"); 25 } 26 } 27
28 //測試方法
29 public static void main(String[] args) { 30 Car c1 = new Audi(); 31 Car c2 = new Benz(); 32 Car c3 = new BMW(); 33 c1.carName(); 34 c2.carName(); 35 c3.carName(); 36 }
此時若是須要增長一個類,那麼開發人員又須要new一個對象。code
解決方案------簡單工廠模式 / 靜態工廠模式
對象
1 package com.qing.factory; 2
3 public class FactoryMethod { 4 /*
5 解決方案一 6 此時外部調用只須要傳一個名字就可new一個該對象。可是此解決方案需改動方法內部代碼結構 7 違反了開閉原則 8 */
9 public static Car getCar(String carName){ 10 if(carName == "Audi") { 11 return new Audi(); 12 } else if(carName == "Benz") { 13 return new Benz(); 14 }else if(carName == "BMW") { 15 return new BMW(); 16 }else{ 17 return null; 18 } 19 } 20 /*
21 解決方案二
直接添加get方法獲取對象 22 這種解決方案雖然也違反了開閉原則,但不涉及方法內部代碼結構的改動, 23 在小型解決方案推薦使用此方案 24 */
25 public static Car getAudi(){ 26 return new Audi(); 27 } 28 public static Car getBenz(){ 29 return new Benz(); 30 } 31 public static Car getBMW(){ 32 return new BMW(); 33 } 34 public static void main(String[] args) { 35 Car audi = FactoryMethod.getAudi(); 36 } 37 }
1 //車接口
2 public interface Car { 3 void carName(); 4 } 5 //車工廠接口
6 public interface CarFactory { 7 Car getCar(); 8 } 9 //奧迪車實現類
10 public class Audi implements Car { 11 @Override 12 public void carName() { 13 System.out.println("I`m Audi Car"); 14 } 15 } 16 //奧迪車工廠實現類
17 public class AudiFactory implements CarFactory{ 18 @Override 19 public Car getCar() { 20 return new Audi(); 21 } 22 } 23 //奔馳車實現類
24 public class Benz implements Car { 25 @Override 26 public void carName() { 27 System.out.println("I`m Benz Car"); 28 } 29 } 30 //奔馳車工廠實現類
31 public class BenzFactory implements CarFactory { 32 @Override 33 public Car getCar() { 34 return new Benz(); 35 } 36 } 37 //寶馬車實現類
38 public class BMW implements Car { 39 @Override 40 public void carName() { 41 System.out.println("I`m BMW Car"); 42 } 43 } 44 //寶馬車工廠實現類
45 public class BMWFactory implements CarFactory { 46 @Override 47 public Car getCar() { 48 return new BMW(); 49 } 50 } 51
52 //測試方法
53 public class MyTest { 54 public static void main(String[] args) { 55 Car c1=new AudiFactory().getCar(); 56 Car c2=new BenzFactory().getCar(); 57 Car c3=new BMWFactory().getCar(); 58 c1.carName(); 59 c2.carName(); 60 c3.carName(); 61 } 62 }
工廠方法模式雖然遵照設計原則,可是從結構複雜度、代碼複雜度、編程複雜度、管理複雜度來講,簡單工廠模式更容易實現。以下圖,實現相同的功能,多了幾個類blog
直接上代碼,整理手機、電腦、魅族、小米之間的瓜關係接口
1 //手機產品接口
2 public interface Phone { 3 void start(); 4 void shutdown(); 5 } 6 //魅族手機
7 public class MezuPhone implements Phone { 8 @Override 9 public void start() { 10 System.out.println("魅族手機開機"); 11 } 12
13 @Override 14 public void shutdown() { 15 System.out.println("魅族手機關機"); 16 } 17 } 18 //小米手機
19 public class MiPhone implements Phone { 20 @Override 21 public void start() { 22 System.out.println("小米手機開機"); 23 } 24
25 @Override 26 public void shutdown() { 27 System.out.println("小米手機關機"); 28 } 29 } 30 //電腦產品接口
31 public interface Computer { 32 void start(); 33 void shutdown(); 34 } 35 //魅族電腦
36 public class MezuComputer implements Computer{ 37 @Override 38 public void start() { 39 System.out.println("魅族電腦開機"); 40 } 41
42 @Override 43 public void shutdown() { 44 System.out.println("魅族電腦關機"); 45 } 46 } 47 //小米電腦
48 public class MiComputer implements Computer { 49 @Override 50 public void start() { 51 System.out.println("小米電腦開機"); 52 } 53
54 @Override 55 public void shutdown() { 56 System.out.println("小米電腦關機"); 57 } 58 } 59 //產品工廠
60 public interface ProductFactory { 61 Phone getPhone(); 62
63 Computer getComputer(); 64 } 65 //魅族工廠
66 public class MezuProduct implements ProductFactory { 67 @Override 68 public Phone getPhone() { 69 return new MezuPhone(); 70 } 71
72 @Override 73 public Computer getComputer() { 74 return new MezuComputer(); 75 } 76 } 77 //小米工廠
78 public class MiProduct implements ProductFactory { 79 @Override 80 public Phone getPhone() { 81 return new MiPhone(); 82 } 83
84 @Override 85 public Computer getComputer() { 86 return new MiComputer(); 87 } 88 }
上圖可看出產品工廠(ProductFactory)能夠建立魅族和小米的產品,就能夠分別獲取手機和電腦對象了(能夠把小米和魅族看做產品族,手機和電腦看做是產品系列)。總之一句話,抽象工廠是工廠的工廠
引用一句維基百科的說明:
工廠模式中的每個形態都是針對必定問題的解決方案,工廠方法針對的是多個產品系列結構;而抽象工廠模式針對的是多個產品族結構,一個產品族內有多個產品系列。
1 bgftg 2 3 4 ger 5 ge 6 7 gers
工廠模式依賴的原則
開閉原則:一個軟件的實體應當對擴展開放,對修改關閉
依賴倒轉原則:要針對接口編程,不要針對實現編程
迪米特法則:只與直接朋友通訊,避免和陌生人通訊