1凿可、什么是簡(jiǎn)單工廠模式惑折?
把一些相關(guān)類的對(duì)象的創(chuàng)建封裝在另一個(gè)類中,這樣在上層的客戶端不需要明白相關(guān)類對(duì)象是如何創(chuàng)建的枯跑,只需要調(diào)用另一個(gè)類的相關(guān)方法獲取實(shí)例即可惨驶。另一個(gè)類就是所說(shuō)的工廠類。為了避免每次使用工廠時(shí)都創(chuàng)建工廠實(shí)例敛助,獲取相關(guān)類實(shí)例的方法一般使用靜態(tài)方法粗卜,所以簡(jiǎn)單工廠一般也叫靜態(tài)工廠。
2纳击、?什么時(shí)候使用工廠模式续扔?
當(dāng)你要對(duì)上層隱藏一些對(duì)象從而達(dá)到解耦的效果時(shí)可以使用簡(jiǎn)單工廠。
3焕数、?如何使用工廠模式纱昧?
- 先看下不使用模式如何創(chuàng)建接口實(shí)例
汽車接口代碼:
public interface CarApi {
public void run();
}
起亞汽車實(shí)現(xiàn)代碼:
public class KiaImpl implements CarApi {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("起亞跑起來(lái)");
}
}
客戶端代碼:
public class Client {
public static void main(String[] args) {
CarApi carApi = new KiaImpl();
carApi.run();
}
}
如上,不使用模式的時(shí)候堡赔,客戶端不僅依賴接口识脆,更知道了接口的實(shí)現(xiàn)類是KiaImpl。要知道Java面向接口編程就是為了封裝隔離善已,達(dá)到解耦模塊的目的灼捂。這里雖然使用了接口,但是充其量只用到了其多態(tài)换团,至于封裝隔離還是沒(méi)影的事兒悉稠。
- 看下使用簡(jiǎn)單工廠是如何實(shí)現(xiàn)的
汽車接口和起亞實(shí)現(xiàn)代碼如上不變,寶馬實(shí)現(xiàn)代碼如下:
public class BmwImpl implements CarApi {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("寶馬跑起來(lái)");
}
}
汽車工廠代碼如下:
public class CarFactory {
public static CarApi getCar(int type) {
CarApi car;
if (type == 0) {
car = new KiaImpl();
} else {
car = new BmwImpl();
}
return car;
}
}
客戶端代碼如下:
public class Client {
public static void main(String[] args) {
// CarApi carApi = new KiaImpl();
// carApi.run();
CarApi kia = CarFactory.getCar(0);
kia.run();
CarApi bmw = CarFactory.getCar(1);
bmw.run();
}
}
通過(guò)客戶端代碼可知啥寇,把實(shí)現(xiàn)類封裝在工廠后偎球,客戶端只需要調(diào)用工廠靜態(tài)方法就能拿到實(shí)現(xiàn)類實(shí)例,而不需要知道這些實(shí)現(xiàn)類是如何創(chuàng)建實(shí)現(xiàn)的辑甜,達(dá)到了解耦的目的衰絮。
有一點(diǎn)要注意:如果接口有多個(gè)實(shí)現(xiàn)類,在工廠中如何確定想要獲取哪個(gè)實(shí)例磷醋?這時(shí)就要在靜態(tài)方法中傳入?yún)?shù)猫牡,這時(shí)客戶端就要知道參數(shù)類型代表的意思。所以此時(shí)底層要向上層暴露一些信息以供使用邓线。