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

定义

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

举例

场景

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

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

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

public interface IPayFactory {
IPay create();
}
  1. 创建具体的支付类,AliPay,WechatPay,实现IPay接口,重写支付方法。
1
2
3
4
5
6
7
8
9
package com.gupao.vip.pay.factorymethod;

public class AliPay implements IPay {

@Override
public void pay() {
System.out.println("用支付宝支付");
}
}
1
2
3
4
5
6
7
8
9
package com.gupao.vip.pay.factorymethod;

public class WechatPay implements IPay {

@Override
public void pay() {
System.out.println("用微信支付");
}
}
  1. 创建微信支付和阿里支付的工厂类,继承抽象工厂,重写抽象工厂的create方法,返回具体的支付类。
1
2
3
4
5
6
7
8
9
package com.gupao.vip.pay.factorymethod;

public class AliPayFactory implements IPayFactory {

@Override
public IPay create() {
return new AliPay();
}
}
1
2
3
4
5
6
7
8
9
package com.gupao.vip.pay.factorymethod;

public class WechatPayFactory implements IPayFactory {

@Override
public IPay create() {
return new WechatPay();
}
}
  1. 在客服端创建所需要的阿里支付和微信支付的工厂,然后由工厂来创建具体的支付类,然后就可以调用各自的支付方法了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.一个类是通过其子类来指定创建对象的。



The End.
  • 本文作者: 湛天伦
  • 本文链接: https://zhantianlun.com/4.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!