工厂方法模式分为三种:
1、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
举例如下:(我们举一个发送邮件和短信的例子)
首先,创建二者的共同接口:
/**
* Created by user on 2017/6/9.
* 创建共同的接口,并暴露Send()方法去实现.
*/
public interface Sender {
public void Send();
}
其次,创建实现类(这里分别是短信发送者和邮件发送者):
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("我是发短信的!!!");
}
}
public class MailSender implements Sender{
@Override
public void Send() {
System.out.println("我是发邮件的!!");
}
}
最后,建工厂类:
/*****************************************************
* 通过工厂的produce()方法来提供工人(发短信和发邮件的),也就是提供实例对象
*/
public class SendFactory {
public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
我们来测试下:
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();//创建一个工厂
Sender sender = factory.produce("sms");//通过工厂提供发短信的人
sender.Send();//工人发短信
}
}
输出 : 我是发短信的!!!
2、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
public class SendFactory {
// public Sender produce(String type) {
// if ("mail".equals(type)) {
// return new MailSender();
// } else if ("sms".equals(type)) {
// return new SmsSender();
// } else {
// System.out.println("请输入正确的类型!");
// return null;
// }
// }
public Sender produceMail() {
return new MailSender();
}
public Sender produceSms() {
return new SmsSender();
}
}
测试类如下:
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();//创建一个工厂
// Sender sender = factory.produce("sms");//通过工厂提供发短信的人
Sender sender = factory.produceMail();
sender.Send();//工人发短信
}
}