Java設計模式之-工廠方法模式
工廠方法模式分爲三種:普通工廠模式、多個工廠方法模式、靜態工廠方法模式。
1、普通工廠模式:以發郵件和短信的例子說明。
結構如下圖所示
主要分爲四個步驟:創建各實例的共同接口、創建各功能實例、創建工廠、主程序。請看如下示例代碼
public class FactoryMethodModel {
public static void main(String[] args) {
String type="mail";
SendFactory factory=new SendFactory();
Sender sender=factory.produce(type);
sender.send();
}
}
// 創建二者的共同接口
interface Sender
{
void send();
}
// 創建實現類 MailSender
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is Mailsender!");
}
}
//創建實現類 SmsSender
class SmsSender implements Sender{
public void send(){
System.out.println("this is SmsSender");
}
}
// 創建工廠類
class SendFactory{
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;
}
}
}
輸出:this is Mailsender!
2、多個工廠方法模式:
是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字符串出錯,則不能正確創建對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象。關係圖:
將上面的代碼修改如下:
public class FactoryMethodModel {
public static void main(String[] args) {
SendFactory factory=new SendFactory();
Sender sender1=factory.produceMailSender();
Sender sender2=factory.produceSmsSender();
sender1.send();
sender2.send();
}
}
// 創建二者的共同接口
interface Sender
{
void send();
}
// 創建實現類 MailSender
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is Mailsender!");
}
}
//創建實現類 SmsSender
class SmsSender implements Sender{
public void send(){
System.out.println("this is SmsSender");
}
}
// 創建工廠類,有多個工廠方法,分別用來創建不同的對象
class SendFactory{
public Sender produceMailSender(){
return new MailSender();
}
public Sender produceSmsSender(){
return new SmsSender();
}
}
輸出結果: this is Mailsender!
this is SmsSender
3、靜態工廠方法模式:
將上面的多個工廠方法模式裏的方法置爲靜態的,不需要創建實例,直接調用即可。
public class FactoryMethodModel {
public static void main(String[] args) {
Sender sender1=SendFactory.produceMailSender();
Sender sender2=SendFactory.produceSmsSender();
sender1.send();
sender2.send();
}
}
// 創建二者的共同接口
interface Sender
{
void send();
}
// 創建實現類 MailSender
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is Mailsender!");
}
}
//創建實現類 SmsSender
class SmsSender implements Sender{
public void send(){
System.out.println("this is SmsSender");
}
}
// 創建工廠類,有多個工廠方法,分別用來創建不同的對象
class SendFactory{
public static Sender produceMailSender(){
return new MailSender();
}
public static Sender produceSmsSender(){
return new SmsSender();
}
}
輸出結果: this is Mailsender!
this is SmsSender
總體來說,工廠模式適合:凡是出現了大量的產品需要創建,並且具有共同的接口時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創建對象,第三種相對於第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。