接口又是怎麼一回事呢 ?接口就是一組規範 ,是在定義一種標準 。這提及來真的挺彆扭的 ,我是這麼理解的 ,當咱們的抽象類全是抽象方法時 ,咱們就能夠定義接口了 ,那爲何不能繼續用抽象類來表示而要定義一個接口呢 ?因爲 Java 自己有單繼承的侷限 ,而接口是能夠多實現的 。因此我就額外定義一個 interface 來表示哪些全是抽象方法的類 。相比於抽象類 ,咱們能夠感覺出 Java 設計的初衷 ,抽象類是做爲模板使用 ,對部分方法進行抽象 ,而接口更多的是對行爲或是方法的抽象 。數據庫
那接口用什麼用呢 ?接口的定義簡單且規範 ,由於不用實現具體的方法 ,而全部的實現類都要實現接口中的方法 。易擴展 ,咱們定義一套接口 ,可使用不一樣的方式來實現它 ,在使用的時候只需調用不一樣的實現類便可 。還有安全 ,說個最多見的例子 ,咱們在 DAO 層定義對數據的 CRUD 操做時 ,就可使用接口來定義 ,具體的實現可能針對的是 MySQL ,Oracle ,SQL server 。當寫業務代碼的同窗調用 DAO 層方法的時候 ,不須要知道也不知道底層操做的是什麼數據庫 。設計模式
以前好像忘了說了 ,設計模式就是一些開發思路和模式的總結 ,說白了就是套路 ,就像趕上感冒你上來就說 「 多喝開水 」 同樣 ,不一樣的設計模式對應不一樣的業務場景 ,那下面就來看一看工廠設計模式 。安全
在工廠模式中 ,咱們在建立對象時不會對客戶端暴露建立邏輯 ,而且是經過使用一個共同的接口( Car )來指向新建立的對象 。這就是一種建立類的方法 。主要體如今工廠中獲取對象的方法的內部邏輯 。像下面示例中的 getCar 方法 。app
public interface Car { void run(); } public class BaoMa implements Car{ @Override public void run() { System.out.println("我在 BaoMa 裏笑。"); } } public class BigCar implements Car{ @Override public void run() { System.out.println("我是 BigCar ,我不怕撞!"); } } public class SmallCar implements Car { @Override public void run() { System.out.println("我是 SmallCar ,看起來精緻!"); } } /** * 工廠決定以何種形式建立對象,爲何叫工廠,也就是由於,對象如何產生是在這裏決定的。 * */ public class CarFactory { // 這是重點呀,返回的都是同一個接口。這也是多態的體現 向上轉型。 public Car getCar(String type){ if(type == null){ return null; } if(type.equalsIgnoreCase("SMALLCAR")){ return new SmallCar(); } else if(type.equalsIgnoreCase("BIGCAR")){ return new BigCar(); } else if(type.equalsIgnoreCase("BAOMA")){ return new BaoMa(); } return null; } } // 測試類 public class FactoryTest { public static void main(String[] args) { CarFactory factory = new CarFactory(); Car car = factory.getCar("smallcar"); car.run(); Car car2 = factory.getCar("bigcar"); car2.run(); Car car3 = factory.getCar("baoma"); car3.run(); } } 我是 SmallCar ,看起來精緻! 我是 BigCar ,我不怕撞! 我在 BaoMa 裏笑。
經過上面的實例咱們能夠看出 ,當咱們的實現類不多了的時候 ,咱們不必使用工廠設計模式 ,可是在使用這種模式以後 ,如果須要添加一個新的業務 ,也是比較方便的 ,( 比方說工廠中又添加了 SuperCar )添加一個實現類便可 ,固然還有 getCar 中的邏輯 ,就達到了擴展的目的 ,而調用人員無需關注這些 。ide
已經說完了抽象類和接口 ,那麼就來總結一下它們兩個的不一樣 。測試
抽象類 | 接口 | |
---|---|---|
定義 | 包含一個抽象方法的類 | 抽象方法和常量的集合 |
組成 | 構造方法,抽象方法,普通方法,常量 | 變量 常量 抽象方法 |
使用 | 子類繼承抽象類 | 子類實現接口 |
關係 | 抽象類能夠實現多個接口 | 接口不能繼承抽象類,但容許繼承多個接口 |
設計模式 | 模板設計模式 | 工廠設計模式,代理設計模式 |
實際 | 做爲一種模板 | 是做爲一個標準或表示一種能力 |
侷限 | 單繼承 | 能夠多繼承 |
實例化 | 不能 | 不能 |