欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

23種設(shè)計模式(2) java工廠模式

 更新時間:2017年11月09日 10:27:40   作者:阿木俠  
這篇文章主要為大家詳細介紹了23種設(shè)計模式之java工廠模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

23種設(shè)計模式第二篇:java工廠模式

定義:

工廠模式是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。

工廠模式主要是為創(chuàng)建對象提供過渡接口,以便將創(chuàng)建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。

工廠模式根據(jù)抽象程度的不同分為三種:

簡單工廠模式(也叫靜態(tài)工廠模式)
工廠方法模式(也叫多形性工廠)
抽象工廠模式(也叫工具箱)

簡單工廠模式 

       實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品類(這些產(chǎn)品類繼承自一個父類或接口)的實例。簡單工廠模式的創(chuàng)建目標,所有創(chuàng)建的對象都是充當這個角色的某個具體類的實例。 

工廠方法模式 

       工廠方法是粒度很小的設(shè)計模式,因為模式的表現(xiàn)只是一個抽象的方法。 提前定義用于創(chuàng)建對象的接口,讓子類決定實例化具體的某一個類,即在工廠和產(chǎn)品中間增加接口,工廠不再負責產(chǎn)品的創(chuàng)建,由接口針對不同條件返回具體的類實例,由具體類實例去實現(xiàn)。 

抽象工廠模式

        當有多個抽象角色時使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個產(chǎn)品對象。它有多個抽象產(chǎn)品類,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類,一個抽象工廠類,可以派生出多個具體工廠類,每個具體工廠類可以創(chuàng)建多個具體產(chǎn)品類的實例。 

工廠方法模式應(yīng)該在實際中用的較多,我們以工廠方法模式舉例
(例子來源百度,幫助理解)

抽象的產(chǎn)品類:定義car  交通工具類

public interface Car { 
 void gotowork();
}

定義實際的產(chǎn)品類,總共定義兩個,bike 和bus 分別表示不同的交通工具類

public class Bike implements Car {
 @Override
 public void gotowork() {
  System.out.println("騎自行車去上班!");
 }
}
public class Bus implements Car {
 @Override
 public void gotowork() {
  System.out.println("坐公交車去上班!");
 }
}

定義抽象的工廠接口

public interface ICarFactory {
 Car getCar();
}

具體的工廠子類,分別為每個具體的產(chǎn)品類創(chuàng)建不同的工廠子類

public class BikeFactory implements ICarFactory {
 @Override
 public Car getCar() {
  return new Bike();
 }
}
public class BusFactory implements ICarFactory { 
@Override
 public Car getCar() {  
  return new Bus();
 }
}

簡單的測試類,來驗證不同的工廠能夠產(chǎn)生不同的產(chǎn)品對象

public class TestFactory {
 @Test
 public void test() {
  ICarFactory factory = null;
  // bike
  factory = new BikeFactory();
  Car bike = factory.getCar();
  bike.gotowork();

  // bus
  factory = new BusFactory();
  Car bus = factory.getCar();
  bus.gotowork();
 }
}

工廠模式的優(yōu)點:

        1、一個調(diào)用者想創(chuàng)建一個對象,只要知道其名稱就可以了,降低了耦合度。
        2、擴展性高,如果想增加一個產(chǎn)品,只要擴展一個工廠類就可以。使得代碼結(jié)構(gòu)更加清晰。
        3、屏蔽產(chǎn)品的具體實現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。 

工廠模式的缺點:

        每次增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠(這里可以使用反射機制來避免),使得系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復雜度,同時也增加了系統(tǒng)具體類的依賴。所以對于簡單對象來說,使用工廠模式反而增加了復雜度。 

工廠模式的適用場景:

        1、  一個對象擁有很多子類。
        2、創(chuàng)建某個對象時需要進行許多額外的操作。
        3、系統(tǒng)后期需要經(jīng)常擴展,它把對象實例化的任務(wù)交由實現(xiàn)類完成,擴展性好。 

關(guān)于Java中的工廠模式的一些常見問題:

        利用父類的向下轉(zhuǎn)型(使用父類類型的引用指向子類的對象)是可以達到類似于工廠模式的效果的,那為什么還要用工廠模式呢?
        把指向子類對象的父類引用賦給子類引用叫做向下轉(zhuǎn)型,如:

Class Student extends Person  
Person s = new Student(); 
s = (Student)person ;

        使用向下轉(zhuǎn)型在客戶端實例化子類的時候,嚴重依賴具體的子類的名字。當我們需要更改子類的構(gòu)造方法的時候,比如增加一個參數(shù),或者更改了子類的類名,所有的new出來的子類都需要跟著更改。   
        但如果我們使用工廠模式,我們僅僅需要在工廠中修改一下new的代碼,其余項目中用到此實例的都會跟著改,而不需要我們手動去操作。(???) 

總結(jié):

        無論是簡單工廠模式、工廠模式還是抽象工廠模式,它們本質(zhì)上都是將不變的部分提取出來,將可變的部分留作接口,以達到最大程度上的復用。究竟用哪種設(shè)計模式更適合,這要根據(jù)具體的業(yè)務(wù)需求來決定。

轉(zhuǎn)自:java知音

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java九九乘法表示例

    java九九乘法表示例

    這篇文章主要介紹了java九九乘法表示例,需要的朋友可以參考下
    2014-04-04
  • 基于Java8實現(xiàn)提高Excel讀寫效率

    基于Java8實現(xiàn)提高Excel讀寫效率

    這篇文章主要介紹了基于Java8實現(xiàn)提高Excel讀寫效率,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • 實例講解Java處理PDF圖章的方法

    實例講解Java處理PDF圖章的方法

    在本篇文章里小編給大家分享了關(guān)于Java處理PDF圖章的方法,對此有需要的朋友們可以學習下。
    2019-02-02
  • SpringBoot中的JPA(Java?Persistence?API)詳解

    SpringBoot中的JPA(Java?Persistence?API)詳解

    這篇文章主要介紹了SpringBoot中的JPA(Java?Persistence?API)詳解,JPA用于將?Java?對象映射到關(guān)系型數(shù)據(jù)庫中,它提供了一種面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,使得開發(fā)者可以更加方便地進行數(shù)據(jù)持久化操作,需要的朋友可以參考下
    2023-07-07
  • SpringBoot詳解整合Spring?Cache實現(xiàn)Redis緩存流程

    SpringBoot詳解整合Spring?Cache實現(xiàn)Redis緩存流程

    這篇文章主要介紹了SpringBoot整合Spring?Cache實現(xiàn)Redis緩存方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • SpringBoot中使用websocket出現(xiàn)404的解決方法

    SpringBoot中使用websocket出現(xiàn)404的解決方法

    在Springboot中使用websocket時,本地開發(fā)環(huán)境可以正常運行,但部署到服務(wù)器環(huán)境出現(xiàn)404問題,所以本文小編講給大家詳細介紹一下SpringBoot中使用websocket出現(xiàn)404的解決方法,需要的朋友可以參考下
    2023-09-09
  • 詳解Java中的字節(jié)碼增強技術(shù)

    詳解Java中的字節(jié)碼增強技術(shù)

    字節(jié)碼增強技術(shù)就是一類對現(xiàn)有字節(jié)碼進行修改或者動態(tài)生成全新字節(jié)碼文件的技術(shù)。本文將通過示例詳細說說Java的字節(jié)碼增強技術(shù),需要的可以參考一下
    2022-10-10
  • JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    這篇文章主要給大家介紹了關(guān)于JAVA中重寫(Override)與重載(Overload)的相關(guān)示例,重寫(override)和重載(overload)是兩種不同的方法重用技術(shù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • java 如何判斷是否可以ping通某個地址

    java 如何判斷是否可以ping通某個地址

    這篇文章主要介紹了java 如何判斷是否可以ping通某個地址,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java基面試礎(chǔ)知識詳解

    java基面試礎(chǔ)知識詳解

    這篇文章主要介紹了java基面試礎(chǔ)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08

最新評論