与简单工厂模式的对比
在简单工厂模式中,每当我们添加了新的功能(例如例子中的Sender类),我们就要为这个类添加一段新的逻辑代码或者工厂函数。这违背了开放封闭原则(对扩展开放,对修改封闭)。工厂方法模式的提出就是为了解决这个问题。
工厂方法模式,定义一个用户创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类(相比于简单工厂方法)。也就是说工厂方法模式实现时,客户端需要决定实例化哪一个工厂来获得实例,选择判断的问题依然存在,只是将内部逻辑判断移到了客户端代码来进行。
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();
}
}