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

轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/39760895


工廠方法模式(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();
	}

}

四、總結

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



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