微信公众号转载,关注微信公众号掌握更多技术动态
---------------------------------------------------------------
注意工厂方法模式中工厂的方法不是静态的
简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了开-闭原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
一、具体案例演示
1.产品接口
public interface Sender {
public void Send();
}
2.具体实现类
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
3.工厂接口+工厂方法类
public interface Provider {
public Sender produce();
}
public class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
public class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
4.客户端代码
public class Client {
private static Provider p1,p2;
private static Sender s1,s2;
public static void main(String[] args) {
p1 = new SendMailFactory();
s1 = p1.produce();
p2 = new SendSmsFactory();
s2 = p2.produce();
}
}
客户端持有工厂接口类型静态变量,而实际类型是具体工厂类,然后客户端调用具体工厂类对象的创建具体产品的方法
工厂方法模式和简单工厂模式
1.工厂方法模式通过创建工厂接口的实现类工厂 解决了简单工厂模式如果想要拓展程序,必须对工厂类进行修改的问题。(如果要扩展工厂类,只要再写一个工厂接口的实现类就可以了)
2.如果一个系统确定只用到一个工厂,我们选择使用静态工厂模式
二、Java语言中工厂方法模式的例子
1.Iterable就是具体类的接口,接口中的 iterator()就是工厂方法,而Collection的实现类就是具体的工厂类
这是ArrayList中的iterator()方法可以看出来,它就是一个工厂方法,返还一个具体的Iterator类
COM、EJB、JMS框架中都用到了工厂方法模式