工廠模式

工廠模式

代碼編寫出來是爲了給別人 (client) 調用的:ide

  • 調用者 (client) 跟代碼編寫者 (provider),多是同一我的,也多是不一樣的人
  • 提供給調用者的代碼,有多是源碼可見的,也多是源碼不可見、不可修改的(好比 jar 包)

因此,爲了簡化代碼的協做使用及管理維護,必須想盡辦法簡化代碼邏輯,實現必要的分離spa

1 最原始的方式

好比說,有一系列的代碼,是用來建立不一樣品牌的手機。代碼是這樣的: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();

這樣的方式很是原始,也很簡單,可是代碼的邏輯不清晰,暴露的內容過多。接口

解決的方案:開發

  • 抽象邏輯,提供接口

2 有了接口以後

爲了減小方法調用的複雜度,也爲了便於抽象跟代碼管理,我們額外提供一個接口:源碼

public interface Phone {
    void play();
}

而後,將全部手機類都實現 Phone 接口,將暴露給客戶端調用的邏輯都封裝在 play 方法裏。產品

那麼,客戶端須要知道的調用 API 就減小到了兩種:it

  1. Phone 接口的信息
  2. Phone 接口有哪些實現類

調用的邏輯就變簡單了:

Phone phone1 = new Iphone();
phone1.play();

Phone phone2 = new Lianxiang();
phone2.play();

Phone phone3 = new Xiaomii();
phone3.play();

這種方式有缺點:

  1. 客戶端,必需要知道手機類的具體名字
  2. 客戶端的調用,跟提供的代碼是耦合的

因此,天然產生了簡單工廠的這種策略

3 簡單工廠

在中間加一層:

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();

簡單工廠模式,自己已經爲解耦合作出了很好的方案。可是它有缺點:

  • PhoneFactory 代碼跟 Phone 代碼緊耦合
  • 每次要添加/刪除/修改某一個 Phone,須要修改 PhoneFactory 這個類

解決方案就是工廠方法模式

4 工廠方法模式

爲 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();

工廠方法模式,是最標準的一種工廠模式,也是應用普遍的一種模式

可是工廠方法模式,有一個很大的缺點:

   每增長一個產品,相應的也要增長一個子工廠,加大了額外的開發量。
相關文章
相關標籤/搜索