在我之前的文章初学策略模式+简单工厂模式练习中,使用支付场景作为例子,使用到了简单工厂模式和策略模式,但是简单工厂模式有一个很大的缺点,当我们需要增加其他支付方式时,需要新增一个新的支付类,然后在工厂类中判断客户端要使用的支付方式是什么,从而创建不同的支付子类,违背了
对修改关闭的面向对象设计原则。而工厂方法设计模式可以轻松解决这个问题
什么是工厂方法模式
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
优点
- 实现了
对修改关闭,对扩展开放的原则,避免代码紧耦合 - 可以
复用现有对象来节省系统资源, 而不是每次都重新创建对象
代码实现
支付子类共同要实现的接口,定义了业务方法
public interface PayInterface {
void pay();
}
支付宝支付具体实现
public class AliPay implements PayInterface{
@Override
public void pay() {
System.out.println("使用支付宝支付");
}
}
微信支付具体实现
public class WeChatPay implements PayInterface{
@Override
public void pay() {
System.out.println("使用微信支付");
}
}
工厂抽象类,其他工厂类要实现它定义的抽象方法
public abstract class PayFactory {
abstract PayInterface createPay();
}
创建支付宝支付实例的工厂类
public class AliPayFactory extends PayFactory{
PayInterface aliPay;
@Override
PayInterface createPay() {
if(aliPay == null){
aliPay = new AliPay();
}
return aliPay;
}
}
创建微信支付的工厂类
public class WeChatPayFactory extends PayFactory {
PayInterface weChatPay;
@Override
PayInterface createPay() {
if(weChatPay == null){
weChatPay = new WeChatPay();
}
return weChatPay;
}
}
测试
public class Main {
public static void main(String[] args) {
//支付宝
PayInterface pay = new AliPayFactory().createPay();
pay.pay();
//微信
WeChatPayFactory weChatPayFactory = new WeChatPayFactory();
PayInterface wxPay = weChatPayFactory.createPay();
wxPay.pay();
}
}