java 23種設計模式(二):創建型模式(工廠方法模式)

工廠模式

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

輸出:使用支付寶支付

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章