工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。
1、适用场景
1)对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
2)只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
2、优点
增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。
3、缺点
增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。
4、代码示例
1)关系图
2)代码实现
//1.需要各个终端共同实现的接口
public interface Sender {
public void Send();
}
//2.终端1:MailSender
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
//3.终端2:SmsSender
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
//4.需要各个终端工厂类共同实现的接口
public interface Provider {
public Sender produce();
}
//5.工厂类1
public class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
//6.工厂类2
public class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
//7.使用方法
public class Test {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}
输出结果:this is mailsender!