代碼編寫出來是爲了給別人 (client) 調用的:ide
因此,爲了簡化代碼的協做使用及管理維護,必須想盡辦法簡化代碼邏輯,實現必要的分離。spa
好比說,有一系列的代碼,是用來建立不一樣品牌的手機。代碼是這樣的:3d
public class Iphone { public void mypg () {} } public class Huawei { public void myhwi () {} } public class Lennovo {} public class Xiaomi {} public class Vivo {}
若是這樣的代碼提供給客戶端調用,那麼提供者必需要將全部類的名稱以及對應的方法暴露給客戶端。code
客戶端的調用示例以下:blog
Iphone pg = new Iphone(); phone1.mypg(); Huawei hw = new Huawei(); phone2.myhw();
這樣的方式很是原始,也很簡單,可是代碼的邏輯不清晰,暴露的內容過多。接口
解決的方案:開發
爲了減小方法調用的複雜度,也爲了便於抽象跟代碼管理,我們額外提供一個接口:源碼
public interface Phone { void play(); }
而後,將全部手機類都實現 Phone 接口,將暴露給客戶端調用的邏輯都封裝在 play 方法裏。產品
那麼,客戶端須要知道的調用 API 就減小到了兩種:it
調用的邏輯就變簡單了:
Phone phone1 = new Iphone(); phone1.play(); Phone phone2 = new Lianxiang(); phone2.play(); Phone phone3 = new Xiaomii(); phone3.play();
這種方式有缺點:
因此,天然產生了簡單工廠的這種策略
在中間加一層:
public class PhoneFactory { public Phone createPhone(String tag) { if (tag.equals("lx")) { return new Lenovo(); } else if (tag.equals("pg")) { return new Iphone(); } else if (tag.equals("hw")) { return new Huawei(); } } }
客戶端的調用:
PhoneFactory pf = new PhoneFactory(); pf.createPhone("hw").play(); pf.createPhone("pg").play(); pf.createPhone("xm").play();
簡單工廠模式,自己已經爲解耦合作出了很好的方案。可是它有缺點:
解決方案就是工廠方法模式
爲 Phone 工廠,建立一個接口:
public interface GCIphoneFactory {
Phone createPhone();
}
若是增長了一款產品,好比是 iPhone,那麼,只須要爲 iPhone 建立一個工廠類就能夠了:
public class IphoneFactory implements GCIphoneFactory { @Override public Phone createPhone() { return new IPhone(); } }
若是再增長另一款產品,好比 Huawei,那麼只須要另一個工廠就能夠了:
public class HuaweiFactory implements GCIphoneFactory { @Override public Phone createPhone() { return new Huawei(); } }
客戶端的調用:
GCIphoneFactory gc = new HuaweiFactory(); gc.createPhone().play(); GCIphoneFactory pg = new IphoneFactory(); pg.createPhone().play();
工廠方法模式,是最標準的一種工廠模式,也是應用普遍的一種模式
可是工廠方法模式,有一個很大的缺點: