工廠模式
1、簡單工廠模式
分類:普通簡單工廠、多方法簡單工廠、靜態方法簡單工廠
1.1普通工廠模式
就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。首先看下關係圖:
代碼如下(舉一個支付寶微信支付的例子):
首先創建支付寶微信共同實現的接口:
public interface Payment {
public void pay();
}
接着實現類:
public class Weixin implements Payment{
@Override
public void pay() {
System.out.println("使用微信支付");
}
}
public class Zhifubao implements Payment{
@Override
public void pay() {
System.out.println("使用支付寶支付");
}
}
接着工廠類:
public class PayFactory {
public Payment getPay(String type) {
if(type.equals("weixin"))
return new Weixin();
else if(type.equals("zhifubao"))
return new Zhifubao();
else
System.out.println("請輸入正確的類型");
return null;
}
}
最後,我們測試下:
public class Test {
public static void main(String[] args) {
PayFactory payFactory = new PayFactory();
payFactory.getPay("weixin").pay();
}
}
輸出:使用微信支付
1.2、多工廠方法模式
簡單工廠模式若傳入的字符串出錯則不能正確創建出對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象,類圖如下:
將簡單工廠的工廠類修改:
public class PayFactory {
public Payment getZhifubaoPay() {
return new Zhifubao();
}
public Payment getWeixinPay() {
return new Weixin();
}
}
接着測試類:
public class Test {
public static void main(String[] args) {
PayFactory payFactory = new PayFactory();
payFactory.getWeixinPay().pay();
}
}
結果:使用微信支付
1.3靜態工廠方法模式
將多工廠方法模式中的方法改爲靜態的即爲靜態工廠方法模式
總結:
工廠模式適合:凡是出現了大量的產品需要創建,並且具有共同的接口時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創建對象,第三種相對於第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。
2、抽象工廠模式
工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。
先創建支付接口:
public interface Payment {
public void pay();
}
截止創建兩個實現類:
public class Zhifubao implements Payment{
@Override
public void pay() {
System.out.println("使用支付寶支付");
}
}
public class Weixin implements Payment{
@Override
public void pay() {
System.out.println("使用微信支付");
}
}
工廠類接口provider:
public interface Provider {
public Payment product();
}
兩個工廠類:
public class WeixinPayFactory implements Provider{
@Override
public Payment product() {
return new Weixin();
}
}
public class ZhifubaoPayFactory implements Provider{
@Override
public Payment product() {
return new Zhifubao();
}
}
測試:
public class Test {
public static void main(String[] args) {
Provider provider = new ZhifubaoPayFactory();
provider.product().pay();
}
}
輸出:使用支付寶支付