1.前言:
不了解簡單工廠模式請先移步:在商城中使用簡單工廠。在這里主要是對springboot中使用簡單工廠模式進行解析。
2.問題:
什么是簡單工廠:它的實現方式是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
然而在Spring中,在啟動容器對時候會通過beanFactory先創建初始化我們要用的類。
一個是要在使用的時候去創建一個產品類,一個是預先已經加載好了我們要使用的對象,那我們要如何解決這個問題呢?
3.場景:在一個商城系統中,用戶可以選擇三種支付方式,微信支付,支付寶支付,余額支付。
4:方法:
我們只要將要用到的支付方式注入到容器中,我們便可以根據bean到名字去容器中獲取。當然只要是很不靈活的。
其次,我們只要再注入一個支付工廠,每次去支付工廠拿自己想要的支付方式。這樣我們就可以像之前那樣,在自己想要的地方,只需要注入一個支付工廠即可。
5.實現:
步驟1.創建接口類
public interface PaymentMethod { void pay(); }
步驟2.實現接口類
//沒有指定value,注入的bean默認首字母小寫 @Service public class Alipay implements PaymentMethod { @Override public void pay() { System.out.println("支付寶支付"); } }
@Service public class BalancePay implements PaymentMethod { @Override public void pay() { System.out.println("余額支付"); } }
@Service public class WechatPay implements PaymentMethod { @Override public void pay() { System.out.println("微信支付"); } }
步驟3.直接在容器中,根據bean的名字獲取需要的對象。
@SpringBootApplication public class SpringBootSimpleFactoryApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringBootSimpleFactoryApplication.class, args); // String[] beans = context.getBeanDefinitionNames(); // for (String bean:beans) { // System.out.println("bean:"+bean); // } //然而在實際開發中,是不可能經常通過context獲取bean的 PaymentMethod paymentMethod = (PaymentMethod) context.getBean("alipay"); paymentMethod.pay(); }
步驟4.創建一個工廠,根據所要給定的信息返回相應的bean
@Service public class PayFactory { @Autowired private Alipay alipay; @Autowired private BalancePay balancePay; @Autowired private WechatPay wechatPay; public PaymentMethod pay(String payType){ switch (payType){ case "balancePay": return balancePay; case "alipay": return alipay; case "wechatPay": return wechatPay; default: System.out.println("支付方式錯誤"); } return null; } }
步驟5.在controller層調用支付工廠。(找不到ResponseResult類,請移步單例模式之餓漢模式中獲取)
@RestController public class PayController { @Autowired private PayFactory payFactory; @RequestMapping("pay") public ResponseResult pay(String payType){ ResponseResult responseResult = ResponseResult.getInstance(); try { PaymentMethod paymentMethod = payFactory.pay(payType); paymentMethod.pay(); responseResult.setMsg("操作成功"); responseResult.setCode(0); }catch (Exception e){ e.printStackTrace(); responseResult.setMsg("支付類型錯誤"); responseResult.setCode(1); } return responseResult; } }
源碼:
在工作中,不能靈活的時候設計模式。希望通過這次的學習,可以加深對設計模式對理解。
接下來會繼續整理出自己在工作對時候可以使用對設計模式,不對望指點。如果文章對您有幫助,github給個start吧。