最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之工廠模式分析【簡單工廠、工廠方法、抽象工廠】

 更新時(shí)間:2018年04月26日 10:50:30   作者:aronykl  
這篇文章主要介紹了Java設(shè)計(jì)模式之工廠模式,結(jié)合實(shí)例形式分析了簡單工廠、工廠方法、抽象工廠等相關(guān)功能、實(shí)現(xiàn)與使用方法,需要的朋友可以參考下

本文實(shí)例講述了Java設(shè)計(jì)模式之工廠模式。分享給大家供大家參考,具體如下:

一、 簡單工廠

先來思考一個(gè)問題。我們平時(shí)寫程序時(shí),會(huì)有這種情況,A對象里面需要調(diào)用B對象的方法,這時(shí)我們使用的一般是new關(guān)鍵字來創(chuàng)建一個(gè)B實(shí)例,然后調(diào)用B實(shí)例的方法。這種做法的壞處在于:A類的方法實(shí)現(xiàn)直接調(diào)用了B類的類名(這種方式也被稱為硬編碼耦合),一旦系統(tǒng)需要重構(gòu):需要使用C類來代替B類時(shí),程序就不得不修改A類代碼,如果應(yīng)用中有100個(gè)或者10000個(gè)類以硬編碼方式耦合了B類,則需要修改100個(gè)、10000個(gè)地方,這顯然是一種非??膳碌氖虑?。

換一個(gè)角度來看這個(gè)問題:對已A對象而言,它只需要調(diào)用B對象的方法,并不關(guān)心B對象的實(shí)現(xiàn)、創(chuàng)建過程,考慮讓B類實(shí)現(xiàn)一個(gè)IB接口,而A類只需要與IB接口耦合——A類并不直接使用new關(guān)鍵字來創(chuàng)建B實(shí)例,而是重新定義一個(gè)工廠類:IBFactory,由該工廠類負(fù)責(zé)創(chuàng)建IB實(shí)例,而A類用過調(diào)用IBFactory工廠的方法來得到IB的實(shí)例。通過以上設(shè)計(jì):需要使用C類代替B類,則只需要讓C類也實(shí)現(xiàn)IB接口,并改寫IBFactory工廠中創(chuàng)建IB實(shí)例的實(shí)現(xiàn)代碼,讓該工廠產(chǎn)生C實(shí)例即可。這種將多個(gè)類對象交給工廠類來生成的設(shè)計(jì)方式叫做簡單工廠模式。

以下是簡單工廠模式的代碼:

/**
 * 簡單工廠模式
 *
 * 需要工廠生產(chǎn)的對象實(shí)例所實(shí)現(xiàn)的共同的接口
 * 發(fā)型接口
 * @author Administrator
 *
 */
public interface Hair {
  /**
   * 畫發(fā)型
   */
  public void draw();
}
/**
 * 左偏分發(fā)型
 * @author Administrator
 *
 */
public class LeftHair implements Hair {
  @Override
  public void draw() {
    System.out.println("----------------畫左偏分發(fā)型-----------------");
  }
}
/**
 * 右偏分發(fā)型
 * @author Administrator
 *
 */
public class RightHair implements Hair {
  @Override
  public void draw() {
    System.out.println("-----------------畫右偏分發(fā)型------------------");
  }
}
/**
 * 生產(chǎn)發(fā)型的工廠
 * 要生產(chǎn)什么發(fā)型 只需在這里改就行了
 * @author Administrator
 *
 */
public class HairFactory {
  public Hair getHair() {
    return new LeftHair();
    //return new RightHair();
  }
}
/**
 * 客戶端測試類
 * @author Administrator
 *
 */
public class HairTest {
  public static void main(String[] args) {
    HairFactory factory = new HairFactory();
    Hair hair = factory.getHair();
    hair.draw();
  }
}

可以看到,如果想把HairTest里面生成的LeftHair改成RightHair,只需修改HairFactory里面getHair方法的實(shí)現(xiàn)即可。

使用簡單工廠模式的優(yōu)勢在于:讓對象的調(diào)用者和對象的創(chuàng)建過程分離,當(dāng)對象調(diào)用者需要對象時(shí),直接向工廠請求即可,從而避免了對象的調(diào)用者與對象實(shí)現(xiàn)類以硬編碼方式耦合,以提高系統(tǒng)的可維護(hù)性、可擴(kuò)展性。當(dāng)然,工廠模式也有一個(gè)小小的缺陷,當(dāng)產(chǎn)品修改時(shí),工廠類也要做相應(yīng)的修改,此處可使用策略模式進(jìn)行解決,下面是代碼。

public interface HairBuilder {
  /**
   * 制造發(fā)型
   * @return
   */
  public Hair getHair();
}
public class LeftHairBuilder implements HairBuilder {
  @Override
  public Hair getHair() {
    return new LeftHair();
  }
}
public class RightHairBuilder implements HairBuilder {
  @Override
  public Hair getHair() {
    return new RightHair();
  }
}
public class HairFactory {
  private HairBuilder hairBuilder;
  public HairFactory(HairBuilder hairBuilder) {
    this.hairBuilder = hairBuilder;
  }
  public void setHairBuilder(HairBuilder hairBuilder) {
    this.hairBuilder = hairBuilder;
  }
  public Hair getHair() {
    return hairBuilder.getHair();
  }
}
public class HairTest {
  public static void main(String[] args) {
//   HairBuilder builder = new LeftHairBuilder();
    HairBuilder builder = new RightHairBuilder();
    HairFactory factory = new HairFactory(builder);
    Hair hair = factory.getHair();
    hair.draw();
  }
}

這種做法的好處是無需再去修改工廠類,將工廠里面的創(chuàng)建對量邏輯根據(jù)不同的策略抽象出來,程序需要?jiǎng)?chuàng)建什么對象,只需網(wǎng)工廠中傳入相應(yīng)的builder即可。

二、工廠方法

在簡單工廠模式中,系統(tǒng)使用工廠類生產(chǎn)所有產(chǎn)品實(shí)例,且該工廠類決定生產(chǎn)哪個(gè)類的實(shí)例,即工廠類負(fù)責(zé)所有的邏輯判斷、實(shí)例創(chuàng)建等工作。

如果不想再工廠類中進(jìn)行邏輯判斷,程序可以為不同的產(chǎn)品類提供不同的工廠,不同的工廠類生產(chǎn)不同的產(chǎn)品,無需再工廠類中進(jìn)行復(fù)雜的邏輯判斷。這就有點(diǎn)類似于上面的簡單工廠模式結(jié)合策略模式,不同的是前者只有一個(gè)工廠,后者需要有多個(gè)工廠。下面是工廠方法模式的代碼。

/**
 * 工廠方法模式
 * 需要工廠生產(chǎn)的對象實(shí)例所實(shí)現(xiàn)的共同的接口
 * @author Administrator
 *
 */
public interface Person {
  public void drawPerson();
}
public class Man implements Person {
  @Override
  public void drawPerson() {
    System.out.println("---------------------draw a man--------------------");
  }
}
public class Women implements Person {
  @Override
  public void drawPerson() {
    System.out.println("--------------------draw a women---------------------");
  }
}
/**
 * 生產(chǎn)人的工廠
 * @author Administrator
 *
 */
public interface PersonFactory {
  //生產(chǎn)人
  public Person getPerson();
}
/**
 * 生產(chǎn)man的工廠
 * @author Administrator
 *
 */
public class ManFactory implements PersonFactory {
  @Override
  public Person getPerson() {
    return new Man();
  }
}
/**
 * 聲場women的工廠
 * @author Administrator
 *
 */
public class WomenFactory implements PersonFactory {
  @Override
  public Person getPerson() {
    return new Women();
  }
}
/**
 * 客戶端測試類
 * @author Administrator
 *
 */
public class PersonTest {
  public static void main(String[] args) {
//   PersonFactory factory = new ManFactory();
    PersonFactory factory = new WomenFactory();
    Person person = factory.getPerson();
    person.drawPerson();
  }
}

這種的典型的特點(diǎn)就是在客戶端代碼中根據(jù)不同的工廠生產(chǎn)其對應(yīng)的產(chǎn)品,不必把復(fù)雜的邏輯都放在工廠類里面判斷。這種實(shí)現(xiàn)有一個(gè)很明顯的缺陷,就是客戶端與工廠類進(jìn)行了耦合。

三、抽象工廠

采用上面的工廠方法的設(shè)計(jì)架構(gòu),客戶端代碼成功與被調(diào)用對象的實(shí)現(xiàn)類分離,但帶來了另一種耦合:客戶端代碼與不同的工廠類耦合。為了解決這種耦合的問題,考慮在增加一個(gè)工廠類,用來生成工廠實(shí)例,實(shí)現(xiàn)生產(chǎn)產(chǎn)品的工廠與客戶端分離,這種設(shè)計(jì)方式被稱為抽象工廠模式。下面是抽象工廠模式的代碼

/**
 * 抽象工廠模式
 * 生產(chǎn)PersonFactory的工廠
 * @author Administrator
 *
 */
public class PersonFactoryFactory {
  public static PersonFactory getPersonFactory(String type) {
    if(type.equalsIgnoreCase("man")) {
      return new ManFactory();
    } else {
      return new WomenFactory();
    }
  }
}
/**
 * 客戶端測試類
 * @author Administrator
 *
 */
public class PersonTest {
  public static void main(String[] args) {
    PersonFactory factory = PersonFactoryFactory.getPersonFactory("man");
    Person person = factory.getPerson();
    person.drawPerson();
  }
}

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Spring高階用法之自定義業(yè)務(wù)對象組件化

    Spring高階用法之自定義業(yè)務(wù)對象組件化

    這篇文章主要介紹了Spring高階用法之自定義業(yè)務(wù)對象組件化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 超詳細(xì)的Java 問題排查工具單

    超詳細(xì)的Java 問題排查工具單

    這篇文章主要介紹了超詳細(xì)的Java 問題排查工具單,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java之CountDownLatch原理全面解析

    Java之CountDownLatch原理全面解析

    這篇文章主要介紹了Java之CountDownLatch原理解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺談Java模板引擎性能對比

    淺談Java模板引擎性能對比

    本篇文章主要介紹了淺談Java模板引擎性能對比 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機(jī)制

    深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機(jī)制

    本文將深入探討SpringMVC的參數(shù)綁定方式,包括基本類型、對象、集合等類型的綁定方式,以及如何處理參數(shù)校驗(yàn)和異常。同時(shí),本文還將介紹SpringMVC的數(shù)據(jù)響應(yīng)機(jī)制,包括如何返回JSON、XML等格式的數(shù)據(jù),以及如何處理文件上傳和下載。
    2023-06-06
  • Java中finally和return的關(guān)系實(shí)例解析

    Java中finally和return的關(guān)系實(shí)例解析

    這篇文章主要介紹了Java中finally和return的關(guān)系實(shí)例解析,總結(jié)了二者的關(guān)系,然后分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java中this與super關(guān)鍵字的使用方法

    java中this與super關(guān)鍵字的使用方法

    這篇文章主要介紹了java中this與super關(guān)鍵字的使用方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家徹底理解應(yīng)用java中this與super,需要的朋友可以參考下
    2017-09-09
  • SpringBoot3整合pageHelper實(shí)現(xiàn)分頁功能

    SpringBoot3整合pageHelper實(shí)現(xiàn)分頁功能

    PageHelper是一個(gè)開源的Java分頁插件,它提供了方便的分頁查詢功能,適用于大多數(shù)基于Java的持久層框架(如MyBatis、Hibernate等),本文給大家介紹了springboot3整合pageHelper實(shí)現(xiàn)分頁功能的方法,需要的朋友可以參考下
    2024-08-08
  • 關(guān)于Java中try finally return語句的執(zhí)行順序淺析

    關(guān)于Java中try finally return語句的執(zhí)行順序淺析

    這篇文章主要介紹了關(guān)于Java中try finally return語句的執(zhí)行順序淺析,需要的朋友可以參考下
    2017-08-08
  • Java 8 Function函數(shù)式接口及函數(shù)式接口實(shí)例

    Java 8 Function函數(shù)式接口及函數(shù)式接口實(shí)例

    函數(shù)式接口(Functional Interface)就是一個(gè)有且僅有一個(gè)抽象方法,但是可以有多個(gè)非抽象方法的接口。接下來通過本文給大家介紹Java 8 Function函數(shù)式接口及函數(shù)式接口實(shí)例代碼,需要的朋友可以參考下
    2018-05-05

最新評論

嵊州市| 六枝特区| 宝应县| 和龙市| 崇礼县| 荣成市| 东城区| 六枝特区| 五原县| 新丰县| 长寿区| 岢岚县| 淮阳县| 玉树县| 巴彦淖尔市| 平江县| 东丽区| 嘉荫县| 衢州市| 盘山县| 镇赉县| 家居| 石景山区| 阿巴嘎旗| 莱州市| 韶关市| 武平县| 田东县| 成都市| 翁源县| 如皋市| 克拉玛依市| 南丰县| 金寨县| 阿拉尔市| 搜索| 台南县| 祥云县| 肇庆市| 慈溪市| 六盘水市|