亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

模式的秘密——工廠模式

難度中級
時長 1小時 0分
學習人數
綜合評分9.03
200人評價 查看評價
9.3 內容實用
8.9 簡潔易懂
8.9 邏輯清晰
    • 設計模式——工廠模式

    一、概念

    ? ? 1、實例化對象,用工廠方法替代new操作;

    ? ? 2、工廠模式包括工廠方法模式和抽象工廠模式;

    ? ? 3、抽象工廠模式是工廠方法模式的擴展。

    二、意圖

    ????1、定義一個接口來創建對象,但是子類來決定哪些類需要被實例化;

    ????2、工廠方法把實例化的工作推遲到子類中去實現。

    三、應用場景

    ????1、有一組類似的對象需要創建;

    ????2、在編碼時不能預見需要創建哪種類的實例;

    ????3、系統需要考慮擴展性,不應依賴于產品類實例如何被創建、組合和表達的細節。

    工廠適用于哪些場景:

    ????1、一個系統應當不依賴于產品類實例被創建、組成和表示的細節,這對于所有形態的工廠模式都是重要的;

    ????2、這個系統的產品有至少一個的產品族;

    ????3、同屬于同一個產品族(例如圣誕系列、元旦系列)的產品是設計成在一起使用的,這一約束必須得在系統的設計中體現出來;

    ????4、不同的產品以一系列的接口的面貌出現,從而使系統不依賴于接口實現的細節。

    常見應用:

    ? ?1、 JDBC——一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。

    ? ?2、 SpringBeanFactory

    ????????BeanFactory 作為Spring基礎的IOC容器,是Spring的一個Bean工廠;如果單從工廠模式的角度考慮,它就是用來“生產Bean”,然后提供給客戶端。

    ????????Bean實例化的過程如下:

    ? ? ? ? ? ? (1)、調用Bean的默認構造方法,或者指定的構造方法,生成bean實例(贊成為instance1);

    ????????????(2)、如果Bean的配置文件中注入了Bean屬性,則在instance1基礎上進行屬性注入形成instance2,這?種注入是覆蓋性的;

    ? ? ? ? ? ? (3)、如果Bean實現了InitializingBean接口,則調用afterPropertiesSet()方法,來改變或操作instance2,得到instance3;

    ????????????(4)、如果Bean的配置文件中制定了init-method="init"屬性,則會調用指定的初始化方法,則在instance3的基礎上調用初始化方法init(),講對象最終初始化為instance4;當然,這個初始化的名字是任意的

    四、動機

    ????項目現狀:在軟件系統中經常面臨著“對象”的創建工作,由于需求的變化,這個“對象”也可能隨之發生變化,但它卻擁有比較穩定的接口。

    ????提供封裝機制去隔離易變“對象”的變化,從而保持系統中依賴該“對象”的“其他對象”不隨著需求的變化而變化。

    ????代碼設計:

    ????????1、盡量松耦合,一個對象的依賴對象的變化與對象本身無關;

    ????????2、具體產品與客戶端剝離,責任分割。

    工廠模式代碼示例:

    public?interface?HairInterface{
    ????//實現發型
    ????public?void?draw();
    }
    //左偏分發型
    public?class?LeftHair?implements?HairInterface{
    ????//畫一個左偏分發型
    ????@Override
    ????public?void?draw(){
    ????????System.out.println("實現了一個左偏分發型......");
    ????}
    }
    //右偏分發型
    public?class?RightHair?implements?HairInterface{
    ????//畫一個右偏分發型
    ????@Override
    ????public?void?draw(){
    ????????System.out.println("實現了一個右偏分發型......");
    ????}
    }
    //中分發型
    public?class?InHair?implements?HairInterface{
    ????//畫一個中分發型
    ????@Override
    ????public?void?draw(){
    ????????System.out.println("實現了一個中分發型......");
    ????}
    }
    public?class?SunnyTest{
    ????public?static?void?main(String[]?args){
    ??????????//此類調用不利于代碼維護,也不利于管理,每次都要自己new一個對象
    ???????HairInterface?left?=?new?LeftHair();
    ???????left.draw();
    ???????HairInterface?right?=?new?RightHair();
    ??????????????right.draw();
    ??????????????
    ???????//工廠創建對象,將類交給工廠管理,要做什么樣的事情讓工廠幫我們創建對象
    ???????HairFactory?factory?=?new?HairFactory();
    ???????HairInterface?left?=?factory.getHair("left");
    ???????left.draw();
    ???????HairInterface?right?=?factory.getHair("right");
    ???????right.draw();
    ??????????????
    ???????//工廠根據類的名稱獲取對象,這樣只需增加類,在創建的時候傳入類限定名就可以
    ???????HairInterface?left?=?factory.getHairByClass("LeftHair的全類限定名");
    ???????left.draw();
    ???????HairInterface?right?=?factory.getHair("RightHair的全類限定名");
    ???????right.draw();
    ??????????????
    ???????//向上面傳入全類限定名很麻煩,在Java中有properties文件可以對類做映射關系,傳參的時候傳入類對應的別名就OK
    ???????HairInterface?left?=?factory.getHairByClassKey("right");
    ???????right.draw();
    ???????HairInterface?in?=?factory.getHairByClassKey("in");
    ??????????????in.draw();
    ????}
    }
    //對發型進行統一的管理
    public?class?HairFactory{
    ????//根據類型來創建對象,但是每多創建一種就要加if判斷
    ????public?HairInterface?getHair(String?key){
    ????????if("left".equals(key)){
    ????????????return?new?LeftHair();
    ????????}else?if("right".equals(key)){
    ????????????return?new?RightHair();
    ????????}
    ????????return?null;
    ????}
    ????//Java反射機制創建對象,根據類的名稱創建對象
    ????public?HairInterface?getHairByClass(String?className){
    ????????try{
    ????????????HairInterface?hair?=?Class.forName(className).newInstance();
    ????????????return?hair;
    ????????}catch(Exception?e){//有具體的異常抓捕,這里用Exception代替
    ????????????e.printStackTrace();
    ????????}
    ????????return?null;
    ????}
    ????//讀取properties文件獲取全類限定名
    ????????public?HairInterface?getHairByClassKey(String?key){
    ????????????try{
    ????????????????Map<String,String>?map?=?new?PropertiesReader().getProperties();
    ????????????????HairInterface?hair?=?Class.forName(map.get(key)).newInstance();
    ????????????????return?hair;
    ????????????}catch(Exception?e){//有具體的異常抓捕,這里用Exception代替
    ????????????????e.printStackTrace();
    ????????????}
    ????????????return?null;
    ????}
    ????
    }
    --type.properties
    left=LeftHair的全類限定名
    right=RightHair的全類限定名
    in=InHair的全類限定名
    //讀取properties文件類
    public?class?PropertiesReader{
    ????public?Map<String,String>?getProperties(){
    ????????Properties?props?=?new?Properties();
    ????????Map<String,String>?map?=?new?HashMap<String,String>();
    ????????try{
    ????????????InputStream?in?=?getClass.getReaourceAsStream("type.properties");
    ????????????props.load(in);
    ????????????Enumration?en?=?props.propertyNames();
    ????????????While(en.hasMoreElements()){
    ????????????????String?key?=?(String)en.nextElement();
    ????????????????String?property?=?props.getProperty(key);
    ????????????????map.put(key,property);
    ????????????????//System.out.println(key?+?"??"+?property);
    ????????????}
    ????????}catch(Exception?e){
    ????????????e.printStackTrace();
    ????????}
    ????????return?map;
    ????}
    ????public?static?void?main(String[]?args){
    ????????PropertiesReader?reader?=?new?PropertiesReader();
    ????????Map<String,String>?map?=?reader.getProperties();
    ????????Syatem.out.println(map.get("in"));
    ????}
    }

    抽象工廠模式類圖:

    http://img1.sycdn.imooc.com//62454a32000175da24801394.jpg

    抽象工廠模式代碼示例:

    //男孩
    public?interface?Boy{
    ????public?void?drawMan();
    }
    //女孩
    public?interface?Girl{
    ????public?void?drawWomen();
    }
    //圣誕系列女孩
    public?class?MCGirl?implements?Girl{??
    ????@override
    ????public?void?drawWomen(){
    ????????System.out.println("圣誕系列的女孩子......");
    ????}
    }
    //元旦系列女孩
    public?class?HNGirl?implements?Girl{????
    ????@override
    ????public?void?drawWomen(){
    ????????System.out.println("新年系列的女孩子......");
    ????}
    }
    //圣誕系列男孩
    public?class?MCBoy?implements?Boy{??
    ????@override
    ????public?void?drawMan(){
    ????????System.out.println("圣誕系列的男孩子......");
    ????}??
    }
    //元旦系列男孩
    public?class?HNBoy?implements?Boy{
    ???@override
    ???public?void?drawMan(){
    ???????System.out.println("新年系列的男孩子......");
    ???}????
    }
    //人物的實現接口
    public?interface?PersonFactory{
    ????public?Boy?getBoy();
    ????
    ????public?Girl?getGirl();
    }
    //圣誕系列工廠
    public?class?MCFactory?implements?PersonFactory{
    ???@override
    ???public?Boy?getBoy(){
    ???????return?new?MCBoy();
    ???}
    ???@override
    ???public?Girl?getGirl(){
    ???????return?new?MCGirl();
    ???}
    ???
    }
    //元旦系列工廠
    public?class?HNFactory?implements?PersonFactory{
    ???@override
    ???public?Boy?getBoy(){
    ???????return?new?HNBoy();
    ???}
    ???@override
    ???public?Girl?getGirl(){
    ???????return?new?HNGirl();
    ???}
    }
    public?class?SunnyTest{
    ???public?static?void?main(String[]?args){
    ???????//生產圣誕系列女孩
    ???????PersonFactory?factory?=?new?MCFactory();
    ???????Girl?girl?=?factory.getGirl();
    ???????girl.drawWomen();
    ???????//生產元旦系列男孩
    ???????PersonFactory?factory?=?new?HNFactory();
    ???????Boy?boy?=?factory.getBoy();
    ???????boy.drawMan();
    ???}
    }

    五、總結

    工廠方法模式和抽象工廠模式對比:

    ????1、工廠模式是一種極端情況的抽象工廠模式,而抽象工廠模式可以看成是工廠模式的推廣;

    ????2、工廠模式用來創建一個產品的等級結構,而抽象工廠模式是用來創建多個產品的等級結構;

    ????3、工廠模式只有一個抽象產品類,而抽象工廠模式有多個抽象產品類

    工廠模式的是想幫助我們:

    ????1、系統可以在不修改具體工廠角色的情況下引進新的產品;

    ????2、客戶端不必關心對象如何創建,交給工廠創建,明確了創建;

    ????3、更好的理解面向對象的原則,面向接口編程,而不要面向實現編程。

    查看全部
    0 采集 收起 來源:工廠模式概述

    2022-03-31

  • 工廠模式.

    查看全部
    0 采集 收起 來源:工廠模式概述

    2020-07-28

  • Enumeration在這里我并不推薦使用,而是推薦使用Iterator接口。此接口的功能與 Iterator 接口的功能是重復的。此外,Iterator 接口添加了一個可選的移除操作,并使用較短的方法名。新的實現應該優先考慮使用 Iterator 接口而不是 Enumeration 接口。

    查看全部
    1 采集 收起 來源:工廠模式應用

    2020-05-08

  • 工廠模式:1、有一組類似的對象需要創建。

    2、在編碼時不能預見需要創建哪種類的實例。

    3、系統需要考慮拓展性,不依賴于產品類實例如何被創建、組合和表達的細節

    查看全部
    0 采集 收起 來源:工廠模式概述

    2020-05-08

  • 理解
    查看全部
    0 采集 收起 來源:總結

    2019-11-27

  • 工廠模式的優點

    查看全部
    0 采集 收起 來源:總結

    2019-05-22

  • 工廠方法模式與抽象工廠模式總結
    查看全部
    0 采集 收起 來源:總結

    2019-03-11

  • 抽象工廠模式類圖

    查看全部
    0 采集 收起 來源:工廠模式概述

    2019-03-11

  • 一,工廠方法和抽象工廠方法的對比: 1)工廠模式是一種極端情況下的抽象工廠模式,通過前面的類圖和代碼實現我們可以看到這樣一個對比,而抽象工廠模式可以看成是工廠模式的推廣, 2)工廠模式用來創建一個產品的等級結構,而抽象工廠模式是用來創建多個產品的等級結構, 3)工廠模式只有一個抽象產品類,而抽象工廠模式有多個抽象產品類,總之就是單一對多個產品的這種對比。 二,工廠模式幫助我們實現了什么呢? 1)系統可以在不修改具體工廠角色的情況下引進新的產品, 2)客戶端不必關系對象如何去創建,明確了職責,對象具體的創建交給了具體的產品,product1,product2,客戶端只要告訴工廠我需要哪一,product1還是product2,它們具體是怎么創建的,怎么組合的,都交給了具體的產品product1,product2 3)更好的理解面向對象的原則,面向接口編程,而不是面向實現編程。 那我們整體的工廠模式就是這樣一個原則。 三,工廠模式適用于哪些場景呢? 1)一個系統應當不依賴于產品類實例被創立,組成和表示的細節,就是說這個產品如何被創建,組成和表現,我們都歸結到具體的產品是如何實現上去了,與前端的client,和中端的factory都是沒有關系的, 2)這個系統的產品至少有一個產品族,工廠方法模式就是一個產品族,它是最簡單的一個等級, 3)同屬于同一個產品族的產品是設計成在一起使用的,這是毋庸置疑的,同屬于一個系列的產品,就是在一起的, 4)不同的產品以一系列的接口的面貌出現,從未使系統不依賴于接口實現的細節,我們都是面向接口編程的,不是面向實現編程的,
    查看全部
    0 采集 收起 來源:總結

    2019-02-27

  • 設計模式---工廠模式——總結? 1、接下來看spring beanfactory,這是非常有名的工具,我們知道spring容器是一個控制反轉,主要作用是生成bean,管理bean,從工廠模式來看,spring beanfactory就是生產bean,然后提供給客戶端。 2、來看一下bean實例化的過程:調用bena的默認構造方式生成bean的實例,暫稱為instance1,如果在bean配置文件中注入了bean的屬性,則在instance1基礎上進行屬性注入形成instance2,這種注入是覆蓋性的,如果bean實現了InitializingBean接口,則調用afterPropertiesSet()方法,來改變或者操作instance2,得到instance3。其中:InitializingBean是spring提供的一個初始化bean的類,如果實現了這個類,則必須實現afterPropertiesSet()方法,接下來,如果bean的配置文件中指定了inti-method="init"屬性,又會調用一個初始化方法,則在instance3的基礎上又會進行一些改變,編程instance4.

    查看全部
    0 采集 收起 來源:總結

    2019-02-27

  • 抽象工廠類就是有一個工廠類接口,有多個具體的工廠類繼承這個工廠類接口,獲取工廠類需要制定具體調用哪一個工廠類實例,然后調用這個工廠類中的方法獲取指定的對象。

    查看全部
  • property工具類的實現

    public?class?propertiesReader?{
    
    public?Map<String,String>?getProperties()?{
    Properties?props=new?Properties();
    Map<String,String>?map=new?HashMap<String,String>();
    try?{
    InputStream?in=getClass().getResourceAsStream("type.properties");
    props.load(in);
    Enumeration?en?=?props.propertyNames();
    while(en.hasMoreElements())
    {
    String?key?=?(String)?en.nextElement();
    String?propery?=?props.getProperty(key);
    map.put(key,?propery);
    }
    }?catch?(IOException?e)?{
    //?TODO?Auto-generated?catch?block
    e.printStackTrace();
    }
    return?map;
    }
    }


    查看全部
    0 采集 收起 來源:工廠模式應用

    2019-02-27

  • @設計模式——工廠模式——工廠模式概述

    設計模式:是一套被反復使用,多數人知曉的,經過分類編目的,代碼設計經驗的總結 好處:可以提高代碼的重用性,讓代碼更容易被他人理解,保證代碼的可靠性 工廠模式: 實例化對象,用工廠方法代替new操作 工廠模式包括工廠方法模式和抽象工廠模式 抽象工廠模式是工廠方法模式的擴展。 工廠模式的意圖:定義一個接口來創建對象,但是讓子類來決定哪些類需要被實例化。 工廠方法把實例化的工作推遲到子類中去實現。 適合工廠模式的情況: (1)有一組類似的對象需要創建。 (2)在編碼的時候不能預見需要創建哪種類的實例。 (3)系統需要考慮擴展性,不應依賴于產品類實例化如何被創建,組合和表達的細節。 設計: (1)盡量松耦合,(2)具體產品與客戶端剝離

    查看全部
    0 采集 收起 來源:工廠模式概述

    2019-02-27

  • 在java開發中,應該活用配置文件去進行開發,將配置文件,加入到我們的擼代碼的思路中,這樣,擼代碼的思維,就比較的開闊

    查看全部
  • 我們現在有動物,植物,兩個對象,這兩個對象可以抽象出一個對象,生物;其中,動物,植物,都分別具有自己的獨有屬性,此時如果采用工廠模式,是否可以對動物,植物,進行增刪改查(自我感覺不適用);其次,如果是生物中的方法,是否可以通過工廠模式實現,比如呼吸(自我感覺適用)。

    因此,針對于工廠模式來說,適用于,在一個方法中,使用了相同屬性的不同對象,如果在一個方法中,使用的不同的屬性,個人感覺,不適用工廠模式

    查看全部
    0 采集 收起 來源:工廠模式應用

    2019-02-12

  • 實例? instance

    查看全部
    0 采集 收起 來源:總結

    2018-12-25

  • 工廠模式的應用:jdbc


    查看全部
    0 采集 收起 來源:總結

    2018-12-25

  • 根據類的名稱來創建對象? ? 反射機制

    查看全部
    0 采集 收起 來源:工廠模式應用

    2018-12-25

  • 工廠模式總結 適用于哪些場景

    查看全部
    0 采集 收起 來源:總結

    2018-12-08

  • 工廠方法 vs 抽象工廠

    查看全部
    0 采集 收起 來源:總結

    2018-12-08

  • 抽象工廠模式 常見應用

    查看全部
首頁上一頁1234567下一頁尾頁

舉報

0/150
提交
取消
課程須知
本課程是 Java 開發課程的中級課程,希望各位小伙伴們在學習本課程之前,了解以下內容: 1、初步具備面向對象的設計思維 2、了解多態概念 3、了解反射
老師告訴你能學到什么?
1、理解工廠模式和抽象工廠模式的思想 2、工廠模式應用場景 3、抽象工廠模式應用場景

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!