工厂方法模式
核心组成
-
IProduct:抽象产品类,描述所有实例所共有的公共接口
-
Product:具体产品类,实现抽象产品类的接口,工厂类创建对象,如果有多个需要定义多个
-
IFactory:抽象工厂类,描述具体工厂的公共接口
-
Factory:具体工场类,实现创建产品类对象,实现抽象工厂类的接口,如果有多个需要定义多个
优点:
-
符合开闭原则,增加一个产品类,只需要实现其他具体的产品类和具体的工厂类;
-
符合单一职责原则,每个工厂只负责生产对应的产品
-
使用者只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则
- 迪米特法则:最少知道原则,实体应当尽量少地与其他实体之间发生相互作用
- 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体
- 里氏替换原则:俗称LSP, 任何基类可以出现的地方,子类一定可以出现, 对实现抽象化的具体步骤的规范
缺点:
- 增加一个产品,需要实现对应的具体工厂类和具体产品类;
- 每个产品需要有对应的具体工厂和具体产品类
代码示例
支付接口
/**
* @ClassName Pay
* @Description 支付接口
* @Author ninghq
* @Date 2020/11/15 13:41
* @Version 1.0.0
**/
public interface Pay {
/**
* 统一下单
*/
void unifiedorder();
}
支付宝支付
/**
* @ClassName AliPay
* @Description 支付宝支付
* @Author ninghq
* @Date 2020/11/15 13:19
* @Version 1.0.0
**/
public class AliPay implements Pay {
@Override
public void unifiedorder() {
System.out.println("支付宝统一支付****");
}
}
微信支付
/**
* @ClassName WeChatPay
* @Description 微信支付
* @Author ninghq
* @Date 2020/11/15 13:25
* @Version 1.0.0
**/
public class WeChatPay implements Pay {
@Override
public void unifiedorder() {
System.out.println("微信统一支付****");
}
}
抽象工厂
/**
* @ClassName PayFactory
* @Description 抽象工厂
* @Author ninghq
* @Date 2020/11/15 13:42
* @Version 1.0.0
**/
public interface PayFactory {
/**
* 创建支付
* @return
*/
Pay createPay();
}
支付宝支付工厂
/**
* @ClassName AliPayFactory
* @Description 支付宝支付工厂
* @Author ninghq
* @Date 2020/11/15 13:44
* @Version 1.0.0
**/
public class AliPayFactory implements PayFactory {
@Override
public Pay createPay() {
return new AliPay();
}
}
微信支付工厂
/**
* @ClassName WeChatPayFactory
* @Description 微信支付工厂
* @Author ninghq
* @Date 2020/11/15 13:45
* @Version 1.0.0
**/
public class WeChatPayFactory implements PayFactory {
@Override
public Pay createPay() {
return new WeChatPay();
}
}
main函数主类
public class PayMain {
public static void main(String[] args) {
PayFactory aliPay = new AliPayFactory();
aliPay.createPay().unifiedorder();
PayFactory weChatPay = new WeChatPayFactory();
weChatPay.createPay().unifiedorder();
}
}
Connected to the target VM, address: '127.0.0.1:18366', transport: 'socket'
支付宝统一支付****
微信统一支付****
Disconnected from the target VM, address: '127.0.0.1:18366', transport: 'socket'
Process finished with exit code 0