一、工廠方法模式分類(3種)
- 普通工廠模式
- 多個工廠方法模式
- 靜態工廠方法模式
二、工廠方法模式詳解
(1)普通工廠模式
普通工廠模式就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。
// 1、創建不同產品的共同接口
public interface Sender {
/**
* 郵寄接口中有一個郵寄方法待實現
*/
public void Send();
}
/**
* 2、(實現類)郵件郵寄類實現了郵寄接口,實現其郵寄的抽象方法
* @author barnett
*
*/
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("I am MailSender!");
}
}
/**
* 短信郵寄類實現了郵寄接口,實現其郵寄的抽象方法
* @author barnett
*
*/
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("I am SmsSender!");
}
}
/**
* 3、工廠類,負責多次製造產品(new出複用的類)
* @author barnett
*
*/
public class SendFactory {
/**
* 工廠類中的生產方法
* @param type 輸入要生產的產品類型
* @return 返回一個產品
*/
public Sender produce(String type) {
if("mail".equals(type)) {
return new MailSender();
} else if("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("請輸入正確的類型!");
return null;
}
}
}
/**
* 4、測試類,實例一個工廠,生產多個產品
* @author barnett
*
*/
public class FactoryTest {
public static void main(String[] args) {
// 創建一個工廠(可多次生產)
SendFactory factory = new SendFactory();
// 使用工廠按照要求生產相應產品
Sender sender = factory.produce("sms");
// 調用產品的方法
sender.Send();
Sender sender2 = factory.produce("mail");
sender2.Send();
}
}
工廠優勢
1、 實例出一個工廠,再生產工廠內可以生產的產品,則只需要調用工廠的生產方法,通過傳入不同的參數,生產不同的產品
2、傳統方式則每次要生產一個產品時都需要實例化,然後調用生產方法
3、這樣一來,要生產產品時,無需瞭解內部細節,交由工廠管理,節省資源
(2)多個工廠方法模式
多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象
而多個工廠方法模式是提供多個工廠方法,分別創建對象。
/**
* 工廠類,負責多次製造產品
* @author barnett
*
*/
public class MultiMethodSendFactory {
/**
* 專門生產郵件郵寄器的方法
* @return
*/
public Sender produceMail() {
return new MailSender();
}
/**
* 專門生產短信郵寄器的方法
* @return
*/
public Sender produceSms() {
return new SmsSender();
}
}
/**
* 測試類,實例一個工廠,生產多個產品
* @author barnett
*
*/
public class MultiMethodFactoryTest {
public static void main(String[] args) {
// 創建一個工廠(可多次生產)
MultiMethodSendFactory factory = new MultiMethodSendFactory();
// 根據不同的需求調用不同的方法
Sender mailSender = factory.produceMail();
mailSender.Send();
Sender smsSender = factory.produceSms();
smsSender.Send();
}
}
(3)靜態工廠方法模式
將上面的多個工廠方法模式裏的方法置爲靜態的,不需要創建實例,直接調用即可。
/**
* 工廠類,負責多次製造產品
* @author barnett
*
*/
public class StaticMethodSendFactory {
/**
* 專門生產郵件郵寄器的方法
* @return
*/
public static Sender produceMail() {
return new MailSender();
}
/**
* 專門生產短信郵寄器的方法
* @return
*/
public static Sender produceSms() {
return new SmsSender();
}
}
/**
* 測試類,直接調用工廠中的靜態方法,生產產品
* @author barnett
*
*/
public class StaticMethodFactoryTest {
public static void main(String[] args) {
Sender mailSender = StaticMethodSendFactory.produceMail();
mailSender.Send();
Sender smsSender = StaticMethodSendFactory.produceSms();
smsSender.Send();
}
}