定义
工厂方法模式是指定义一个创建对象的接口,然后实现这个接口的工厂来决定创建什么样的实例。工厂方法让类的实例推迟到子类中进行。在这个模式中,只关心需要创建的是什么工厂,不需要关心创建的细节。而且新加入的产品符合开闭原则。
举例
场景
有一个支付场景,支付的方式有多种,微信支付,阿里支付,银联支付。如何实现工厂方法模式。
步骤
- 创建支付接口,里面定义抽象的支付方法。
package com.gupao.vip.pay.factorymethod;
public interface IPay {
void pay();
}
- 创建工厂接口,提供创建的方法,返回支付接口。
package com.gupao.vip.pay.factorymethod;
public interface IPayFactory {
IPay create();
}
- 创建具体的支付类,AliPay,WechatPay,实现IPay接口,重写支付方法。
package com.gupao.vip.pay.factorymethod;
public class AliPay implements IPay {
@Override
public void pay() {
System.out.println("用支付宝支付");
}
}
package com.gupao.vip.pay.factorymethod;
public class WechatPay implements IPay {
@Override
public void pay() {
System.out.println("用微信支付");
}
}
- 创建微信支付和阿里支付的工厂类,继承抽象工厂,重写抽象工厂的create方法,返回具体的支付类。
package com.gupao.vip.pay.factorymethod;
public class AliPayFactory implements IPayFactory {
@Override
public IPay create() {
return new AliPay();
}
}
package com.gupao.vip.pay.factorymethod;
public class WechatPayFactory implements IPayFactory {
@Override
public IPay create() {
return new WechatPay();
}
}
- 在客服端创建所需要的阿里支付和微信支付的工厂,然后由工厂来创建具体的支付类,然后就可以调用各自的支付方法了。
package com.gupao.vip.pay.factorymethod;
public class Test {
public static void main(String[] args) {
IPayFactory aliPayFactory = new AliPayFactory();
IPay aliPay = aliPayFactory.create();
aliPay.pay();
IPayFactory wechatPayFactory = new WechatPayFactory();
IPay wwechatPay = wechatPayFactory.create();
wwechatPay.pay();
IPayFactory uniPayFactory = new UniPayFactory();
IPay uniPay = uniPayFactory.create();
uniPay.pay();
}
}
总结
工厂方法模式只要解决了产品的扩展问题。在简单工厂中,如果在支付的同时需要加入其他的逻辑,而每个支付的逻辑都不一样,那么这个工厂的职责会变得非常的重。有点像万能工厂,不易于维护。而根据软件设计的单一职责原则,我们可以将工厂的职责拆分开来,专人干专事。阿里支付工厂就用来创建阿里支付,微信支付工厂就用来创建微信支付。
但同时这种设计模式也有它的缺点。它增加了类的创建个数,提升了系统的复杂度和可理解度。
所以,工厂方法模式适用的场景是:1.创建对象需要大量重复的代码。2.客服端(应用层)不依赖于产品的实例如何被创建。3.一个类是通过其子类来指定创建对象的。