Java常用设计模式————工厂模式
簡介:
工廠模式(Factory Pattern)是Java中最常用的設計模式之一,又稱多態工廠模式、虛擬構造器模式。屬于創建型模式。
在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的接口來指向新創建的對象。
主要作用:
將類的實例化(具體產品的創建)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該實例化那一個類。
應用場景:
1.在編碼時無法預見創建哪種類的實例。
2.系統不應依賴于產品類實例如何被創建、組合和表達的細節。
解決問題:
在簡單工廠模式中,存在著一個重要的缺陷:工廠一旦需要生產新產品就需要修改工廠類的方法邏輯,違背了OCP原則(Open Closed Principle)。因此為了解決這一問題,工廠方法模式把具體產品的創建推遲到工廠類的子類(具體工廠)中,此時工廠類不再負責所有產品的創建,而只是給出具體工廠必須實現的接口,這樣工廠方法模式在添加新產品的時候就不修改工廠類邏輯而是添加新的工廠子類,符合開閉原則,克服了簡單工廠模式中的缺點。
實現步驟:
第一步:創建產品接口
package design.pattern.factory1; /*** 抽象的產品類別* <br>類名:Car<br>* 作者: mht<br>* 日期: 2018年3月20日-下午11:41:50<br>*/ public interface Car {/** 跑*/public void run();/** 漂移*/public void dift();}第二步:根據業務需要創建具體產品類:產品A產品B實現產品接口
package design.pattern.factory1;/*** 卡車類:實現車接口的具體車類* <br>類名:Truck<br>* 作者: mht<br>* 日期: 2018年3月20日-下午11:45:03<br>*/ public class Truck implements Car{@Overridepublic void run() {System.out.println("卡車跑...");}@Overridepublic void dift() {System.out.println("卡車漂移...不作不死...");}} package design.pattern.factory1;/*** 公交車:實現車類的具體車類* <br>類名:Bus<br>* 作者: mht<br>* 日期: 2018年3月21日-上午8:24:19<br>*/ public class Bus implements Car{@Overridepublic void run() {System.out.println("公交車跑...");}@Overridepublic void dift() {System.out.println("公交車漂移...不作不死!");}} package design.pattern.factory1;/*** 轎車:實現騎車類的具體車類* <br>類名:Sedan<br>* 作者: mht<br>* 日期: 2018年3月21日-上午8:24:55<br>*/ public class Sedan implements Car{@Overridepublic void run() {System.out.println("轎車跑...");}@Overridepublic void dift() {System.out.println("轎車漂移...更輕松...");}}第三步:創建工廠類
這里注意,有些人會單獨創建一個工廠接口,然后再創建具體的工廠實現類,每個具體工廠都會有一個用于返回具體產品的方法,在命名上也與具體產品類保持一致,比如:工廠A(實現工廠接口)——(生產)產品A;工廠B——產品B ?......這種方法本人覺得實現起來過于別扭,而工廠類屬于中間類,大可不必與產品各個配套,這樣反而使得在產生新產品的同時使項目中類的數量成對增加。以下是工廠類的另一種比較方便的實現方式:
package design.pattern.factory1;public class CarFactory {/*** 獲得汽車方法 <br>* 作者: mht<br>* 時間:2018年3月20日-下午11:52:54<br>*/public static Car getCar(Class c) {if (c == null)return null;try {/*** 通過newInstance()方法,可以避免工廠類的抽象,將生產過程通過產品的類信息而<br>* 使工廠類達到"一般化"的效果。單獨抽象工廠類,然后在生產產品的時候用new的原始方式,<br>* 需要額外擴展對應具體產品的工廠類,而這種newInstance()方式,實際上簡化了這種復雜性,<br>* 卻同樣解決了新增產品需要修改工廠類邏輯的問題。*/Car car = (Car) c.newInstance();return car;} catch (Exception e) {e.printStackTrace();}return null;} }以上三步已經達到了工廠方法模式的實現,我們通過一個main方法簡單的測試來看一下效果:
package design.pattern.factory1;public class testFactoryPattern {public static void main(String[] args) {Car bus = CarFactory.getCar(Bus.class);bus.run();bus.dift();Car truck = CarFactory.getCar(Truck.class);truck.run();truck.dift();Car sedan = CarFactory.getCar(Sedan.class);sedan.run();sedan.dift();} }運行結果:
公交車跑... 公交車漂移...不作不死! 卡車跑... 卡車漂移...不作不死... 轎車跑... 轎車漂移...更輕松...對工廠模式的理解:
工廠模式充分利用了Java語言中繼承和多態的特性。通過分析產品A與產品B或產品C之間存在的共性,抽象出一個可以涵蓋這些產品特性的適當超類,然后通過這個超類的具體子類決定具體生產哪種產品而達到多態的目的。多態的意義就是“一個接口,多種實現”,而這里的“接口”不僅僅是表示Interface關鍵字修飾的抽象類,應該是更廣義上的接口或抽象類,上面的代碼實際上也可以通過將Car設計成abstract class 通過extends的方式來達到目的。
而更廣義上的“工廠模式”實際上是包括了簡單工廠、工廠方法、抽象工廠三種從簡單到復雜的設計模式。
在有名的OOD的設計原則中有一個叫做里氏代換原則(Liskov Substitution Principle, LSP)。它的實質也就是講向上轉型。它的內容是:任何接收父類型的地方,都應當能夠接收子類型,換句話說如果使用的是一個基類的話,那么一定適用于其子類,而且程序察覺不出基類對象和子類對象的區別。LSP是繼承復用的基石,只有當派生類可以替換掉基類,軟件的功能不受到影響時,基類才能真正被復用。?
?
總結
以上是生活随笔為你收集整理的Java常用设计模式————工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: socket抓包_64、抓包分析tcp与
- 下一篇: Spring Boot————静态方法如