类图如下:
代码示例如下:
public class FactoryMethod {
public static void main(String[] args) {
SenderFactory senderFactory = new SenderFactory();
Sender sender = senderFactory.produce("mail");
sender.send();
}
}
interface Sender {
public void send();
}
class MailSender implements Sender {
public void send() {
System.out.println("Send by mail");
}
}
class SmsSender implements Sender {
public void send() {
System.out.println("Send by sms");
}
}
class SenderFactory {
public Sender produce(String type) {
if (type.equals("mail")) {
return new MailSender();
}
if (type.equals("sms")) {
return new SmsSender();
}
return null;
}
}
缺点:
如果增加了一种新的 Sender
,比如 WeixinSender
,则需要修改 SenderFactory
类中的 produce(String type)
方法,违反了开闭原则。
我们可以通过使用抽象工厂模式来解决上述问题。参见 Java 抽象工厂模式 Abstract Factory。