亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

設計模式之工廠方法模式

geekidentity / 2486人閱讀

摘要:通過工廠方法模式的類圖可以看到,工廠方法模式有四個要素工廠接口工廠接口是工廠方法模式的核心,與調用者直接交互用來提供產品。使用場景創(chuàng)建類模式,在任何需要生成復雜對象的地方,都可以使用工廠方法模式。

0x01.定義與類型

定義:定義一個創(chuàng)建對象的接口,但讓實現這個接口的類來決定實例化那個類,工廠方法讓類的實例化推遲到子類中進行

類型:創(chuàng)建型

uml類圖

代碼

//工廠接口
public interface IFactory {
    IProduct createProduct();
}

//產品接口
public interface IProduct {
    void produce();
}

//工廠實現
public class Factory implements IFactory {
    @Override
    public IProduct createProduct() {
        return new Product();
    }
}

//產品實現
public class Product implements IProduct{
    @Override
    public void produce() {
        System.out.println("具體產品業(yè)務。");
    }
}

//應用 / 測試類
public class Test {
    public static void main(String[] args) {
        IFactory factory = new Factory();
        IProduct product = factory.createProduct();
        product.produce();
    }
}

應用 / 測試類輸出結果

具體產品業(yè)務。

通過工廠方法模式的類圖可以看到,工廠方法模式有四個要素:

工廠接口:工廠接口是工廠方法模式的核心,與調用者直接交互用來提供產品。在實際編程中,有時候也會使用一個抽象類來作為與調用者交互的接口,其本質上是一樣的。

工廠實現:在編程中,工廠實現決定如何實例化產品,是實現擴展的途徑,需要有多少種產品,就需要有多少個具體的工廠實現。

產品接口:產品接口的主要目的是定義產品的規(guī)范,所有的產品實現都必須遵循產品接口定義的規(guī)范。產品接口是調用者最為關心的,產品接口定義的優(yōu)劣直接決定了調用者代碼的穩(wěn)定性。同樣,產品接口也可以用抽象類來代替,但要注意最好不要違反里氏替換原則。

產品實現:實現產品接口的具體類,決定了產品在客戶端中的具體行為。

0x02.簡單工廠對比工廠方法

簡單工廠只有三個要素,他沒有工廠接口,并且得到產品的方法一般是靜態(tài)的。

因為沒有工廠接口,所以在工廠實現的擴展性方面稍弱,可以算是工廠方法模式的簡化版。

簡單工廠如果發(fā)生變動是需要修改工廠方法,違反了開閉原則。

0x03.使用場景

創(chuàng)建類模式,在任何需要生成復雜對象的地方,都可以使用工廠方法模式。有一點需要注意的地方就是復雜對象適合使用工廠模式,而簡單對象,特別是只需要通過new就可以完成創(chuàng)建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統(tǒng)的復雜度。

工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現的尤為明顯。假如調用者自己組裝產品需要增加依賴關系時,可以考慮使用工廠模式。將會大大降低對象之間的耦合度。

由于工廠模式是依靠抽象架構的,它把實例化產品的任務交由實現類完成,擴展性比較好。也就是說,當需要系統(tǒng)有比較好的擴展性時,可以考慮工廠模式,不同的產品用不同的實現工廠來組裝。

總結的說

創(chuàng)建對象需要大量重復的代碼

客戶端(應用層)不依賴于產品類實例如何被創(chuàng)建、實現等細節(jié)

一個類通過其子類來指定創(chuàng)建那個對象(具有產品抽象)

0x04.優(yōu)點

用戶只需要關心所需要產品對應的工廠,無需關心創(chuàng)建細節(jié)

加入新產品符合開閉原則,提高可擴展性

0x05.缺點

類的個數容易過多,增加復雜度

增加了系統(tǒng)的抽象性和理解難度

0x06.實現樣例

在線教育網站具有多種技術種類視頻

視頻工廠與視頻類的定義

//視頻工廠
public abstract class VideoFactory {
    public abstract Video getVideo();
}

//視頻類
public abstract class Video {
    public abstract void produce();
}

Java視頻的實現

//Java視頻工廠
public class JavaVideoFactory extends VideoFactory {
    @Override
    public JavaVideo getVideo() {
        return new JavaVideo();
    }
}

//Java視頻
public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("錄制Java課程視頻");
    }
}

Python視頻實現

//Python視頻工廠
public class PythonVideoFactory extends VideoFactory {
    @Override
    public PythonVideo getVideo() {
        return new PythonVideo();
    }
}

//Python視頻
public class PythonVideo extends Video{
    @Override
    public void produce() {
        System.out.println("錄制Python課程");
    }
}

前端課程實現

//前端視頻實現
public class FEVideoFactory extends VideoFactory {
    @Override
    public FEVideo getVideo() {
        return new FEVideo();
    }
}

//前端視頻
public class FEVideo extends Video {
    @Override
    public void produce() {
        System.out.println("錄制前端視頻");
    }
}

應用與測試類實現

public class Test {

    public static void main(String[] args) {
        VideoFactory videoFactory = new JavaVideoFactory();
        Video video1 = videoFactory.getVideo();
        video1.produce();

        videoFactory = new PythonVideoFactory();
        Video video2 = videoFactory.getVideo();
        video2.produce();

        videoFactory = new FEVideoFactory();
        Video video3 = videoFactory.getVideo();
        video3.produce();
    }
}

輸出結果

錄制Java課程視頻
錄制Python課程
錄制前端視頻

實現UML類圖

0x07.源碼中的工廠方法

Collection.iterator()方法

每個集合的具體實現都有一個實現了Iterator的具體實現

Collection.iterator相當于是工廠方法

ArrayList中的iterator是其中的內部類的實現的工廠

public Iterator iterator() {
    return new Itr();
}
private class Itr implements Iterator {
    //省略了具體實現
}

使用私有內部類來實現具體產品,實現iterator方法,來生成具體的實現。

URLStreamHandlerFactory工廠

log4j, logback---->LoggerFactory

0x08.源碼地址

工廠方法模式:https://github.com/sigmako/design-pattern/tree/master/factory-method

0x09.參考

慕課網設計模式精講: https://coding.imooc.com/class/270.html

23種設計模式(2):工廠方法模式: https://blog.csdn.net/zhengzhb/article/details/7348707

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/74755.html

相關文章

  • PHP面試???em>之設計模式——工廠模式

    摘要:工廠模式其實可以劃分為簡單工廠模式工廠方法模式抽象工廠模式等。簡單工廠模式介紹簡單工廠模式又稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。此模式是對工廠方法模式的進一步擴展。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試常考之設計模式——工廠模式周三:PHP面試??贾O計模式——建造者模式周五:PHP...

    Jiavan 評論0 收藏0
  • 優(yōu)才公開課筆記:php設計模式 (二)工廠模式

    摘要:但本質是,簡單工廠并未嚴格遵循設計模式的開閉原則,當需要增加新產品時也需要修改工廠代碼。但是工廠方法則嚴格遵守開閉原則,模式只負責抽象工廠接口,具體工廠交給客戶去擴展。 最近開展了三次設計模式的公開課,現在來總結一下設計模式在PHP中的應用,這是第二篇創(chuàng)建型模式之工廠模式。 設計模式的一般介紹在第一篇文章講了,這里就不重復。 工廠模式 實現:定義一個用于創(chuàng)建對象的接口,讓子類決定實...

    aisuhua 評論0 收藏0
  • 設計模式系列工廠模式

    摘要:設計模式之工廠模式工廠模式包括了簡單工廠工廠方法和抽象工廠。工廠方法模式下面我們針對普通工廠模式的缺點進行優(yōu)化。 設計模式之工廠模式 工廠模式包括了簡單工廠、工廠方法和抽象工廠。下面我從java實際應用的角度分別介紹這三種模式。 簡單工廠模式 下面看下JDBC中獲取Connection的代碼 public class ConnectionFactory { public Con...

    MrZONT 評論0 收藏0
  • 一天一個設計模式JS實現——工廠模式

    摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的...

    Muninn 評論0 收藏0
  • 工廠模式(一)抽象工廠模式

    摘要:主要詳解簡單工廠模式到抽象工廠模式的演變。抽象工廠模式當一個類別的產品還有多個系列區(qū)分時,為了按系列生產商品,使用抽象工廠區(qū)分。 主要詳解簡單工廠模式到抽象工廠模式的演變。 簡單工廠模式 即靜態(tài)工廠模式1.將對象的創(chuàng)建和使用分開;2.將生產過程集中,便于集中管理;3.當需要創(chuàng)建的對象類有變動時,就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡單工廠模式 ---...

    woshicixide 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<