欢迎关注微信公众号:FSA全栈行动 👋java
工厂模式提供了一种建立对象的最佳方式,咱们在建立对象时不会对客户端暴露建立逻辑,而且是经过使用一个共同的接口来指向新建立的对象。微信
提示:工厂模式适合复杂对象的建立markdown
简单工厂能够根据不一样参数返回不一样类的实例,须要专门定义一个工厂类来负责建立其余类的实例,被建立实例一般都具备共同的父类或接口;简单工厂又称 静态工厂方法,可经过类名直接调用 ,并且只须要传入简单的参数便可。ide
建立抽象产品类:oop
/** * 抽象产品 * * @author GitLqr */
public interface IPay {
/** * 下单功能 */
void order();
}
复制代码
建立具体产品类:微信支付
/** * 具体产品:微信支付 * * @author GitLqr */
public class WechatPay implements IPay {
@Override
public void order() {
System.out.println("微信 下单");
}
}
/** * 具体产品:支付宝支付 * * @author GitLqr */
public class AliPay implements IPay {
@Override
public void order() {
System.out.println("支付宝 下单");
}
}
复制代码
建立工厂类:spa
/** * 工厂类 * * @author GitLqr */
public class PayFactory {
/** * 根据参数 返回对应的支付对象 */
public static IPay createPay(String payType) {
switch (payType) {
case "alipay":
return new AliPay();
case "wechat":
return new WechatPay();
default:
return null;
}
}
}
复制代码
使用:设计
public static void main(String[] args) {
// 简单工厂
// IPay pay = PayFactory.createPay("alipay");
IPay pay = PayFactory.createPay("wechat");
pay.order();
}
复制代码
工厂方法又称 工厂模式,是对简单工厂模式的进一步抽象化,其好处是可使系统在不修改原来代码的状况下引进新的产品,即知足开闭原则。经过工厂父类定义负责建立产品的公共接口,经过子类来肯定所须要建立的类型。code
建立抽象工厂类:orm
/** * 抽象工厂类 * * @author GitLqr */
public interface IPayFactory {
public IPay getPay();
}
复制代码
建立具体工厂类:
/** * 具体工厂类:建立 支付宝支付 对象 * * @author GitLqr */
public class AliPayFactory implements IPayFactory {
@Override
public IPay getPay() {
return new AliPay();
}
}
/** * 具体工厂类:建立 微信支付 对象 * * @author GitLqr */
public class WechatPayFactory implements IPayFactory {
@Override
public IPay getPay() {
return new WechatPay();
}
}
复制代码
使用:
public static void main(String[] args) {
// 工厂方法
// IPayFactory payFactory = new AliPayFactory();
IPayFactory payFactory = new WechatPayFactory();
payFactory.getPay().order();
}
复制代码
补充:若是后续须要增长第三种支付方式,好比银联支付,那么只须要再扩展出具体产品
UnionPay
,以及具体工厂UnionPayFactory
便可,而无需改动原有的类。
抽象工厂模式是基于上述两种模式的拓展,是工厂方法模式的升级版,当须要建立的产品有多个产品线时使用抽象工厂模式是比较好的选择。
补充:当抽象工厂模式中每个具体工厂类只建立一个产品对象时,抽象工厂模式退化成工厂方法模式。
假设 "产品" 如今不仅有 支付,还须要有 退款,提现 等,这时,"产品" 的【抽象产品类】和【具体产品类】将拓展为以下所示:
支付(IPay) | 退款(IRefund) | 提现(ICashout) | |
---|---|---|---|
支付宝 | AliPay | AliRefund | AliCashout |
微信 | WechatPay | WechatRefund | WechatCashout |
银联 | UnionPay | UnionRefund | UnionCashout |
根据 工厂方法模式 的核心要求(一种工厂 对应生成 一种产品),那么对应的【抽象工厂类】和【具体工厂类】将拓展为以下所示:
支付(IPayFactory) | 退款(IRefundFactory) | 提现(ICashoutFactory) | |
---|---|---|---|
支付宝 | AliPayFactory | AliRefundFactory | AliCashoutFactory |
微信 | WechatPayFactory | WechatRefundFactory | WechatCashoutFactory |
银联 | UnionPayFactory | UnionRefundFactory | UnionCashoutFactory |
这时就会发现,严格按照工厂方法模式的要求会有以下弊端:
其实这些 "产品"(支付、退款、提现...)都是属于一类(订单相关), 所以,能够对【抽象工厂类】进行加强,由一个【抽象工厂类】来负责生产一类 "产品",例如能够建立 IOrderFactory,汇总 IPayFactory、IRefundFactory、ICashoutFactory 的建立方法并对它们进行取缔。因而,使用了抽象工厂模式后,对应的【抽象工厂类】和【具体工厂类】将拓展为以下所示:
支付、退款、提现(IOrderFactory) | |
---|---|
支付宝 | AliOrderFactory |
微信 | WechatOrderFactory |
银联 | UnionOrderFactory |
注意:抽象工厂 相比 工厂方法,就是加强了抽象工厂类,同时思想上也有了重大变化,让抽象工厂类再也不局限于一种产品,而是一系列产品。
建立抽象产品类:
/** * 抽象产品 * * @author GitLqr */
public interface IRefund {
/** * 退款 */
void refund();
}
复制代码
建立具体产品类:
/** * 具体产品:支付宝退款 * * @author GitLqr */
public class AliRefund implements IRefund {
@Override
public void refund() {
System.out.println("支付宝 退款");
}
}
/** * 具体产品:微信退款 * * @author GitLqr */
public class WechatRefund implements IRefund {
@Override
public void refund() {
System.out.println("微信 退款");
}
}
复制代码
建立抽象工厂类【加强版】:
/** * 抽象工厂类【加强版】 * * @author GitLqr */
public interface IOrderFactory {
IPay getPay();
IRefund getRefund();
}
复制代码
建立具体工厂类【加强版】:
/** * 具体工厂类:建立 支付宝 订单相关的一系列产品功能 * * @author GitLqr */
public class AliOrderFactory implements IOrderFactory {
@Override
public IPay getPay() {
return new AliPay();
}
@Override
public IRefund getRefund() {
return new AliRefund();
}
}
/** * 具体工厂类:建立 微信 订单相关的一系列产品功能 * * @author GitLqr */
public class WechatOrderFactory implements IOrderFactory {
@Override
public IPay getPay() {
return new WechatPay();
}
@Override
public IRefund getRefund() {
return new WechatRefund();
}
}
复制代码
还能够借鉴简单工厂模式,建立一个"超级工厂类",根据不一样参数获取不一样的具体工厂,方便使用者使用:
public class OrderFactoryProducer {
public static IOrderFactory getFactory(String type) {
switch (type) {
case "alipay":
return new AliOrderFactory();
case "wechat":
return new WechatOrderFactory();
default:
return null;
}
}
}
复制代码
说明:【简单工厂模式】的最大缺点就是负责了全部具体产品的建立,而这里则不一样,具体产品的建立已交由具体工厂去建立,"超级工厂类" 只负责找到合适的具体工厂,与产品没有直接关系。固然,”超级工厂类“这种方式方式仍是不符合开闭原则的,需本身权衡利弊,我的感受至少比让使用者直接使用具体工厂要好控制一些。
使用:
public static void main(String[] args) {
// 抽象工厂
// IOrderFactory orderFactory = OrderFactoryProducer.getFactory("alipay");
IOrderFactory orderFactory = OrderFactoryProducer.getFactory("wechat");
orderFactory.getPay().order();
orderFactory.getRefund().refund();
}
复制代码
若是文章对您有所帮助, 请不吝点击关注一下个人微信公众号:FSA全栈行动, 这将是对我最大的激励. 公众号不只有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技能知识点哦~