工厂方法设计模式

80 阅读2分钟

在我之前的文章初学策略模式+简单工厂模式练习中,使用支付场景作为例子,使用到了简单工厂模式和策略模式,但是简单工厂模式有一个很大的缺点,当我们需要增加其他支付方式时,需要新增一个新的支付类,然后在工厂类中判断客户端要使用的支付方式是什么,从而创建不同的支付子类,违背了对修改关闭的面向对象设计原则。而工厂方法设计模式可以轻松解决这个问题

什么是工厂方法模式

工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

优点

  • 实现了对修改关闭,对扩展开放的原则,避免代码紧耦合
  • 可以复用现有对象来节省系统资源, 而不是每次都重新创建对象

代码实现

支付子类共同要实现的接口,定义了业务方法

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();  
    }  
}