Java設(shè)計(jì)模式-簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式(邏輯判斷)
對(duì)實(shí)現(xiàn)同一個(gè)接口的類,我們可以使用一個(gè)工廠類來(lái)封裝這些類的創(chuàng)建,通過(guò)傳入一個(gè)類的標(biāo)識(shí)來(lái)獲得該類的示例(邏輯判斷)。這種設(shè)計(jì)模式我們稱作簡(jiǎn)單工廠設(shè)計(jì)模式。
下面用UML圖來(lái)表示該設(shè)計(jì)模式下類與類之間的關(guān)系
示例代碼
package factory;
public class SimpleFactoryMethodTest
{
public static void main(String[] args)
{
SimpleFactory factory = new SimpleFactory();
Sender s1 = factory.createSender("email");
s1.send();
Sender s2 = factory.createeSender("sms");
s2.send();
}
}
class SimpleFactory
{
public Sender createSender(String name)
{
if ("email".equals(name))
{
return new EmailSender();
}
else if ("sms".equals(name))
{
return new SMSSender();
}
else
{
System.out.println(name + " not found!");
return null;
}
}
}
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");
}
}
簡(jiǎn)單工廠模式(多個(gè)方法)
多個(gè)方法的簡(jiǎn)單工廠模式本質(zhì)上還是一種簡(jiǎn)單工廠模式,只不過(guò)將原來(lái)的邏輯判斷分到了不同的執(zhí)行方法中來(lái),每一個(gè)不同的類對(duì)應(yīng)一個(gè)產(chǎn)生它們的方法。這種模式可以避免出現(xiàn)邏輯判斷條件不存在的錯(cuò)誤,由工廠調(diào)用者選擇實(shí)例化的類。
示例代碼
package factory;
public class MultiFactoryMethodTest
{
public static void main(String[] args)
{
SimpleFactory factory = new SimpleFactory();
Sender s1 = factory.produceEmailSender();
s1.send();
Sender s2 = factory.produceSMSSender();
s2.send();
}
}
class SimpleFactory
{
public Sender produceEmailSender()
{
return new EmailSender();
}
public Sender produceSMSSender()
{
return new SMSSender();
}
}
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");
}
}
簡(jiǎn)單工廠模式(靜態(tài)方法)
靜態(tài)方法的簡(jiǎn)單工廠模式將原有工廠類中的方法改為靜態(tài)方法,這樣就不用創(chuàng)建工廠類實(shí)例了。
示例代碼
package factory;
public class StaticFactoryMethodTest
{
public static void main(String[] args)
{
Sender s1 = SimpleFactory.produceEmailSender();
s1.send();
Sender s2 = SimpleFactory.produceSMSSender();
s2.send();
}
}
class SimpleFactory
{
public static Sender produceEmailSender()
{
return new EmailSender();
}
public static Sender produceSMSSender()
{
return new SMSSender();
}
}
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");
}
}