1. 程式人生 > >Java設計模式菜鳥系列(四)工廠方法模式建模與實現

Java設計模式菜鳥系列(四)工廠方法模式建模與實現

工廠方法模式(Factory Method

工廠方法:顧名思義,就是呼叫工廠裡的方法來生產物件(產品)的。
工廠方法實現方式有3種:

一、普通工廠模式。就是建立一個工廠類,對實現了同一介面的一些類進行例項的建立。

1、uml建模圖:


2、程式碼實現

/**
 * 示例(一):普通工廠方法
 * 
 * 缺點:如果傳遞的字串出錯,則不能正確建立物件
 */
interface Sender {
	public void send();
}

class EmailSender implements Sender {

	@Override
	public void send() {
		System.out.println("使用電子郵箱傳送...");
	}

}

class SmsSender implements Sender {

	@Override
	public void send() {
		System.out.println("使用簡訊傳送...");
	}

}

/**
 * 產品工廠
 */
class SendFactory {
	public Sender produceSender(String type) {
		if ("email".equals(type)) {
			return new EmailSender();
		} else if ("sms".equals(type)) {
			return new SmsSender();
		} else {
			System.out.println("沒有這種型別...");
			return null;
		}

	}
}

/**
 * 客戶端測試類
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		// 建立工廠
		SendFactory sendFactory = new SendFactory();
		// 生產產品
		Sender sender = sendFactory.produceSender("email");
		// 發貨
		sender.send();
	}

}

二、多個工廠方法模式是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。

1、uml建模圖:

2、程式碼實現

/**
 * 示例(二):多個工廠方法
 * 
 * 優點:多個工廠方法模式是提供多個工廠方法,分別建立物件
 */
interface Sender {
	public void send();
}

class EmailSender implements Sender {

	@Override
	public void send() {
		System.out.println("使用電子郵箱傳送...");
	}

}

class SmsSender implements Sender {

	@Override
	public void send() {
		System.out.println("使用簡訊傳送...");
	}

}

/**
 * 不同方法分別生產相應的產品
 */
class SendFactory {
	public Sender produceEmail() {
		return new EmailSender();
	}

	public Sender produceSms() {
		return new SmsSender();
	}
}

/**
 * 客戶端測試類
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		// 建立工廠
		SendFactory sendFactory = new SendFactory();
		// 生產產品
		Sender senderEmail = sendFactory.produceEmail();
		// 發貨
		senderEmail.send();
	}

}

三、靜態工廠方法模式將上面的多個工廠方法模式裡的方法置為靜態的,不需要建立例項,直接呼叫即可。

1、uml建模圖:


2、程式碼實現

/**
 * 示例(三):靜態工廠方法
 * 
 * 優點:多個工廠方法模式是提供多個工廠方法,分別建立物件
 */
interface Sender {
	public void send();
}

class EmailSender implements Sender {

	@Override
	public void send() {
		System.out.println("使用電子郵箱傳送...");
	}

}

class SmsSender implements Sender {

	@Override
	public void send() {
		System.out.println("使用簡訊傳送...");
	}

}

/**
 * 靜態工廠:不同例項化工廠
 * 
 * 不同方法分別生產相應的產品
 */
class SendFactory {
	public static Sender produceEmail() {
		return new EmailSender();
	}

	public static Sender produceSms() {
		return new SmsSender();
	}
}

/**
 * 客戶端測試類
 * 
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		// 直接生產產品
		Sender senderEmail = SendFactory.produceEmail();
		// 發貨
		senderEmail.send();
	}

}

四、總結

總體來說,凡是出現了大量的產品需要建立,並且具有共同的介面時,可以通過工廠方法模式進行建立。在以上的三種模式中,第一種如果傳入的字串有誤,不能正確建立物件,第三種相對於第二種,不需要例項化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式