工厂模式的理解及实际运用

工厂设计模式:工厂模式是java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,可以提供一种创建对象的最佳方式,工厂只负责实现创建所有实例的内部逻辑,并且创建对象的方法可以被外部直接调用创建所需要的的对象实例;1、有点在于 一个调用者想创建一个对象,只要知道其名称就可以了,比如有些对象创建过程比较复杂代码量比较大那么使用工厂就可以减少代码量;2、屏蔽产品的具体实现调用者只需要关注产品接口就可以;3、降低了代码的耦合度,比如又甲乙丙都使用到了B 对象,常规操作需要在甲乙丙都创建B对象,使用了工厂的话直接修改创建B 的工厂类就可以而不用去甲乙丙中去修改B;

快速理解

下面就以以mobile和car为例,两者都是一个产品 都可以有展示的功能,那么就可以使用工厂模式,抽象出一个展示的接口show();两者都实现这个接口以增加展示的功能,使用工厂模式获取两个对象的时候只需要传入car或者mobile的名字就可以创建该对像,而不用去new 对象然后调用对象的show()方法就可以;
在这里插入图片描述```
public interface Product {
//查看产品详情
void show();
}
public class Mobile implements Product {
//产品详情
@Override
public void show() {
System.out.println(“手机:HUAWEI P40 Pro +”);
}
}

public class Car implements Product {
@Override
public void show() {
System.out.println(“汽车:比亚迪!”);
}
}

public class ProductFactory {

/***
 * 根据用户的需求创建不同的产品
 * @return
 */
public static Product getBean(String name){
    if(name.equals("mobile")){
        return new Mobile();
    }else if(name.equals("car")){
        return new Car();
    }
    return null;
}

}
public static void main(String[] args) {
Product mobile = ProductFactory.getBean(“mobile”);
Product car = ProductFactory.getBean(“car”);
mobile.show();
car.show();
}

实际应用场景

工厂方法在SpringBoot中,如果在用工厂的同时又出现了new,那绝对是一个败笔。在SpringBoot中,几乎所有对象都可以直接交给Spring容器管理,它天然已经是一个工厂对象,因此在SpringBoot项目中用工厂模式,再频繁new对象反而不妥。那么工厂模式究竟怎么用在SpringBoot项目的支付场景呢?其实很简单,如果我们要选择一个支付渠道,而项目中有100种支付渠道,那这个时候无疑要写100个@Autowired 注入100个支付渠道,并且需要做100种判断,这个时候我们可以用工厂模式取代我们判断,直接根据我们配置的映射关系从Spring容器中拿到对应支付渠道的实例,代码量将大大减少,这块是使用工厂的另一种秒用。
具体实现支付接口: PayChannel 定义支付行为。

public interface PayChannel {
		/*** * 支付 */ 
		void pay();
 }
微信实现支付

@Component(“weixinPay”)
public class WeixinPay implements PayChannel {
@Override
public void pay() {
System.out.println(“微信支付成功!”);
}
}

支付宝实现支付

@Component(“aliPay”)
public class AliPay implements PayChannel {
@Override
public void pay() {
System.out.println(“支付宝支付成功!”);
}
}

将支付渠道配置在yml文件中,每次从前端传入一个支付id就可以从配置文件中获取支付渠道对应spring容器中的实例id

yml文件配置如下
#支付通道列表
pay:
paymap: {“1”:“weixinPay”,“2”:“aliPay”}

支付渠道获取工厂创建:创建payFactory用于获取支付渠道的实例,通过映射的key获取spring容器中的实例id值,然后从Spring容器中根据id获取对应的实例,因此工厂需要实现接口applicationContextAware接口来获取容器

@Data
@Component
@ConfigurationProperties(prefix = “pay”)
public class PayFactory implements ApplicationContextAware{
//Spring容器 private static ApplicationContext applicationContext;
//支付键值对信息 private Map<String,String> paymap;
/*** * 创建支付通道,从paymap中获取对应通道的实例名字,从applicationContext获取通道实例 /
public PayChannel createChannel(String key){
return applicationContext.getBean(paymap.get(key),PayChannel.class);
}
/
** * 获取容器
* @param applicationContext *
@throws BeansException */

@Override 
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
    PayFactory.applicationContext = applicationContext; 
    } 

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值