工厂方法模式分为三种:
普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
定义发送接口
package test.factory;
public interface Sender {
public void send();
}
Mail实现发送接口
package test.factory;
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is mailSender");
}
}
SMS实现发送接口
package test.factory;
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("this is smsSender");
}
}
发送工厂
package test.factory;
public class SendFactroy {
//普通工厂
public Sender produce(String type) {
if (null == type) {
return null;
}
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输入正确的类型");
return null;
}
}
//多个工厂
public Sender produeMailSeeder(){
return new MailSender();
}
public Sender produceSmsSender(){
return new SmsSender();
}
//静态工厂
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
测试结果
package test.factory;
public class Test {
public static void main(String[] args) {
System.out.println("-----普通工厂-----");
SendFactroy factory = new SendFactroy();
Sender send = factory.produce("mail");
Sender sender = factory.produce("sms");
send.send();
sender.send();
System.out.println("-----多个工厂-----");
SendFactroy factor = new SendFactroy();
Sender se = factor.produceSmsSender();
Sender sr = factor.produeMailSeeder();
se.send();
sr.send();
System.out.println("-----静态工厂-----");
Sender sd = SendFactroy.produceMail();
Sender sn = SendFactroy.produceSms();
sd.send();
sn.send();
}
}
工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。