【设计模式】工厂模式之工厂方法模式

Alan 242 2019-04-22

定义

工厂方法模式是指定义一个创建对象的接口,然后实现这个接口的工厂来决定创建什么样的实例。工厂方法让类的实例推迟到子类中进行。在这个模式中,只关心需要创建的是什么工厂,不需要关心创建的细节。而且新加入的产品符合开闭原则。

举例

场景

​ 有一个支付场景,支付的方式有多种,微信支付,阿里支付,银联支付。如何实现工厂方法模式。

步骤
  1. 创建支付接口,里面定义抽象的支付方法。
package com.gupao.vip.pay.factorymethod;

public interface IPay {
    void pay();
}
  1. 创建工厂接口,提供创建的方法,返回支付接口。
package com.gupao.vip.pay.factorymethod;

public interface IPayFactory {
    IPay create();
}
  1. 创建具体的支付类,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("用微信支付");
    }
}

  1. 创建微信支付和阿里支付的工厂类,继承抽象工厂,重写抽象工厂的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();
    }
}
  1. 在客服端创建所需要的阿里支付和微信支付的工厂,然后由工厂来创建具体的支付类,然后就可以调用各自的支付方法了。
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.一个类是通过其子类来指定创建对象的。


# 设计模式