Java設(shè)計模式-簡單工廠模式
簡單工廠模式(邏輯判斷)
對實現(xiàn)同一個接口的類,我們可以使用一個工廠類來封裝這些類的創(chuàng)建,通過傳入一個類的標(biāo)識來獲得該類的示例(邏輯判斷)。這種設(shè)計模式我們稱作簡單工廠設(shè)計模式。
下面用UML圖來表示該設(shè)計模式下類與類之間的關(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");
}
}
簡單工廠模式(多個方法)
多個方法的簡單工廠模式本質(zhì)上還是一種簡單工廠模式,只不過將原來的邏輯判斷分到了不同的執(zhí)行方法中來,每一個不同的類對應(yīng)一個產(chǎn)生它們的方法。這種模式可以避免出現(xiàn)邏輯判斷條件不存在的錯誤,由工廠調(diào)用者選擇實例化的類。

示例代碼
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");
}
}
簡單工廠模式(靜態(tài)方法)
靜態(tài)方法的簡單工廠模式將原有工廠類中的方法改為靜態(tài)方法,這樣就不用創(chuàng)建工廠類實例了。
示例代碼
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");
}
}