工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建。一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建。
根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式、多个工厂方法模式和静态工厂方法模式。
一、普通工厂方法模式:
常见的经典写法如下(以发送邮件和短信为例):
1.定义邮件类和短信类具有的共同接口:
interface Sender{ public void sender(); }
2.定义邮件类和短信类:
class MailSender implements Sender{ @Override
public void send() {
System.out.println("发送邮件");
} }
class SmsSender implements Sender{ @Override
public void send() {
System.out.println("发送短信");
} }
3.定义工厂类:
class SenderFactory { public Sender produce(String type) {
if (type.equals("mail")) {
return new MailSender();
} else if (type.equals("sms")) {
return new SmsSender();
} else {
return null;
}
} }
4.测试生成MailSender和SmsSender对象:
package com.qqyumidi; public class FactoryMethodTest { public static void main(String[] args) {
SenderFactory factory = new SenderFactory();
Sender mailSender = factory.produce("mail");
Sender smsSender = factory.produce("sms");
} }
二、多个工厂方法模式:
将普通工厂模式中的工厂类中创建类的方法从依赖于参数判断改为直接针对每种对象各自定义一个生产方法。
具体代码如下:
class SenderFactory { public Sender produceMail(){
return new MailSender();
} public Sender produceSms(){
return new SmsSender();
} }
三、静态工厂方法模式:
静态工厂方法模式与前面两种具体的方法定义不同在于方法被定义成静态的,这样可以不通过创建工厂实例就能直接获取到目标类的对象。
class SenderFactory { public static Sender produceMail(){
return new MailSender();
} public static Sender produceSms(){
return new SmsSender();
} }
对于工厂方法模式,推荐使用第三种写法。