轉載請註明出處: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();
}
}
四、總結
總體來說,凡是出現了大量的產品需要創建,並且具有共同的接口時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創建對象,第三種相對於第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。