1.前言:html
不瞭解簡單工廠模式請先移步:在商城中使用簡單工廠。在這裏主要是對springboot中使用簡單工廠模式進行解析。git
2.問題:github
什麼是簡單工廠:它的實現方式是由一個工廠類根據傳入的參數,動態決定應該建立哪個產品類(這些產品類繼承自一個父類或接口)的實例。spring
然而在Spring中,在啓動容器對時候會經過beanFactory先建立初始化咱們要用的類。設計模式
一個是要在使用的時候去建立一個產品類,一個是預先已經加載好了咱們要使用的對象,那咱們要如何解決這個問題呢?springboot
3.場景:在一個商城系統中,用戶能夠選擇三種支付方式,微信支付,支付寶支付,餘額支付。微信
4:方法:app
咱們只要將要用到的支付方式注入到容器中,咱們即可以根據bean到名字去容器中獲取。固然只要是很不靈活的。ide
其次,咱們只要再注入一個支付工廠,每次去支付工廠拿本身想要的支付方式。這樣咱們就能夠像以前那樣,在本身想要的地方,只須要注入一個支付工廠便可。spring-boot
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吧。