上一篇:Java設(shè)計(jì)模式-簡(jiǎn)單工廠模式
與簡(jiǎn)單工廠模式的對(duì)比
在簡(jiǎn)單工廠模式中,每當(dāng)我們添加了新的功能(例如例子中的Sender類)友驮,我們就要為這個(gè)類添加一段新的邏輯代碼或者工廠函數(shù)漂羊。這違背了開放封閉原則(對(duì)擴(kuò)展開放,對(duì)修改封閉)卸留。工廠方法模式的提出就是為了解決這個(gè)問題走越。
工廠方法模式,定義一個(gè)用戶創(chuàng)建對(duì)象的接口耻瑟,讓子類決定實(shí)例化哪一個(gè)類旨指。工廠方法使一個(gè)類的實(shí)例化延遲到其子類(相比于簡(jiǎn)單工廠方法)赏酥。也就是說工廠方法模式實(shí)現(xiàn)時(shí),客戶端需要決定實(shí)例化哪一個(gè)工廠來獲得實(shí)例谆构,選擇判斷的問題依然存在裸扶,只是將內(nèi)部邏輯判斷移到了客戶端代碼來進(jìn)行。
UML類圖
FactoryMethodTest.java
package factory;
public class FactoryMethodTest
{
public static void main(String[] args)
{
SenderFactory emailSenderFactory = new EmailSenderFactory();
Sender sender = emailSenderFactory.createSender();
sender.send();
SMSSenderFactory smsSenderFactory = new SMSSenderFactory();
sender = smsSenderFactory.createSender();
sender.send();
}
}
interface Sender
{
public void send();
}
class EmailSender implements Sender
{
@Override
public void send()
{
System.out.println(getClass().getName() + " send");
}
}
class SMSSender implements Sender
{
@Override
public void send()
{
System.out.println(getClass().getName() + " send");
}
}
interface SenderFactory
{
public Sender createSender();
}
class SMSSenderFactory implements SenderFactory
{
@Override
public Sender createSender()
{
return new SMSSender();
}
}
class EmailSenderFactory implements SenderFactory
{
@Override
public Sender createSender()
{
return new EmailSender();
}
}