抽象工厂模式
核心组成
AbstractFactory:抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品,如创建支付和创建退款。
ConcreteFactory:具体工厂角色,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
AbstractProduce:抽象产品角色,它为每种产品声明接口。
ConcreteProduce:具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
优点:
- 当一个产品族中的多个对象被设计成一起工作时,它能保证使用方始终只使用同一个产品族中的对象
- 产品等级结构扩展容易,如果需要增加多一个产品等级,只需要增加新的工厂类和产品类即可, 比如增加银行支付、退款
缺点:
-
产品族扩展困难,要增加一个系列的某一产品,既要在抽象的工厂和抽象产品里修改代码,不是很符合开闭原则
-
增加了系统的抽象性和理解难度
代码示例
抽象订单工厂
public interface OrderFactory {
/**
* 创建支付
* @return
*/
PayFactory createPay();
/**
* 创建退款
* @return
*/
RefundFactory createRefund();
}
支付工厂
public interface PayFactory {
/**
* 统一下单
*/
void unifiedorder();
}
退款工厂
public interface RefundFactory {
/**
* 退款
*/
void refund();
}
支付宝订单具体工厂
public class AliOrderFactory implements OrderFactory {
@Override
public PayFactory createPay() {
return new AliPay();
}
@Override
public RefundFactory createRefund() {
return new AliRefund();
}
}
支付宝支付具体实现
public class AliPay implements PayFactory {
@Override
public void unifiedorder() {
System.out.println("支付宝支付");
}
}
支付宝退款具体实现
public class AliRefund implements RefundFactory {
@Override
public void refund() {
System.out.println("支付宝退款");
}
}
微信订单具体工厂
public class WeChatOrderFactory implements OrderFactory {
@Override
public PayFactory createPay() {
return new WeChatPay();
}
@Override
public RefundFactory createRefund() {
return new WeChatRefund();
}
}
微信支付具体实现
public class WeChatPay implements PayFactory {
@Override
public void unifiedorder() {
System.out.println("微信支付");
}
}
微信退款具体实现
public class WeChatRefund implements RefundFactory{
@Override
public void refund() {
System.out.println("微信退款");
}
}
超级工厂生产器
public class FactoryProducer {
public static OrderFactory getFactory(String type){
if (type.equalsIgnoreCase("WECHAT")) {
return new WeChatOrderFactory();
} else if (type.equalsIgnoreCase("ALI")) {
return new AliOrderFactory();
} else if (type.equalsIgnoreCase("BANK")) {
return new BankOrderFactory();
}
return null;
}
}
main函数主类
public class PayMain {
weChatPay.createPay().unifiedorder();
OrderFactory orderFactory = FactoryProducer.getFactory("ALI");
orderFactory.createPay().unifiedorder();
orderFactory.createRefund().refund();
}
}