摘要:通過工廠方法模式的類圖可以看到,工廠方法模式有四個要素工廠接口工廠接口是工廠方法模式的核心,與調(diào)用者直接交互用來提供產(chǎn)品。使用場景創(chuàng)建類模式,在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式。
0x01.定義與類型
定義:定義一個創(chuàng)建對象的接口,但讓實現(xiàn)這個接口的類來決定實例化那個類,工廠方法讓類的實例化推遲到子類中進行
類型:創(chuàng)建型
uml類圖
代碼
//工廠接口 public interface IFactory { IProduct createProduct(); } //產(chǎn)品接口 public interface IProduct { void produce(); } //工廠實現(xiàn) public class Factory implements IFactory { @Override public IProduct createProduct() { return new Product(); } } //產(chǎn)品實現(xiàn) public class Product implements IProduct{ @Override public void produce() { System.out.println("具體產(chǎn)品業(yè)務(wù)。"); } } //應(yīng)用 / 測試類 public class Test { public static void main(String[] args) { IFactory factory = new Factory(); IProduct product = factory.createProduct(); product.produce(); } }
應(yīng)用 / 測試類輸出結(jié)果
具體產(chǎn)品業(yè)務(wù)。
通過工廠方法模式的類圖可以看到,工廠方法模式有四個要素:
工廠接口:工廠接口是工廠方法模式的核心,與調(diào)用者直接交互用來提供產(chǎn)品。在實際編程中,有時候也會使用一個抽象類來作為與調(diào)用者交互的接口,其本質(zhì)上是一樣的。
工廠實現(xiàn):在編程中,工廠實現(xiàn)決定如何實例化產(chǎn)品,是實現(xiàn)擴展的途徑,需要有多少種產(chǎn)品,就需要有多少個具體的工廠實現(xiàn)。
產(chǎn)品接口:產(chǎn)品接口的主要目的是定義產(chǎn)品的規(guī)范,所有的產(chǎn)品實現(xiàn)都必須遵循產(chǎn)品接口定義的規(guī)范。產(chǎn)品接口是調(diào)用者最為關(guān)心的,產(chǎn)品接口定義的優(yōu)劣直接決定了調(diào)用者代碼的穩(wěn)定性。同樣,產(chǎn)品接口也可以用抽象類來代替,但要注意最好不要違反里氏替換原則。
產(chǎn)品實現(xiàn):實現(xiàn)產(chǎn)品接口的具體類,決定了產(chǎn)品在客戶端中的具體行為。
0x02.簡單工廠對比工廠方法簡單工廠只有三個要素,他沒有工廠接口,并且得到產(chǎn)品的方法一般是靜態(tài)的。
因為沒有工廠接口,所以在工廠實現(xiàn)的擴展性方面稍弱,可以算是工廠方法模式的簡化版。
簡單工廠如果發(fā)生變動是需要修改工廠方法,違反了開閉原則。
0x03.使用場景創(chuàng)建類模式,在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式。有一點需要注意的地方就是復(fù)雜對象適合使用工廠模式,而簡單對象,特別是只需要通過new就可以完成創(chuàng)建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統(tǒng)的復(fù)雜度。
工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現(xiàn)的尤為明顯。假如調(diào)用者自己組裝產(chǎn)品需要增加依賴關(guān)系時,可以考慮使用工廠模式。將會大大降低對象之間的耦合度。
由于工廠模式是依靠抽象架構(gòu)的,它把實例化產(chǎn)品的任務(wù)交由實現(xiàn)類完成,擴展性比較好。也就是說,當(dāng)需要系統(tǒng)有比較好的擴展性時,可以考慮工廠模式,不同的產(chǎn)品用不同的實現(xiàn)工廠來組裝。
總結(jié)的說
創(chuàng)建對象需要大量重復(fù)的代碼
客戶端(應(yīng)用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細(xì)節(jié)
一個類通過其子類來指定創(chuàng)建那個對象(具有產(chǎn)品抽象)
0x04.優(yōu)點用戶只需要關(guān)心所需要產(chǎn)品對應(yīng)的工廠,無需關(guān)心創(chuàng)建細(xì)節(jié)
加入新產(chǎn)品符合開閉原則,提高可擴展性
0x05.缺點類的個數(shù)容易過多,增加復(fù)雜度
增加了系統(tǒng)的抽象性和理解難度
0x06.實現(xiàn)樣例在線教育網(wǎng)站具有多種技術(shù)種類視頻
視頻工廠與視頻類的定義
//視頻工廠 public abstract class VideoFactory { public abstract Video getVideo(); } //視頻類 public abstract class Video { public abstract void produce(); }
Java視頻的實現(xiàn)
//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視頻實現(xiàn)
//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課程"); } }
前端課程實現(xiàn)
//前端視頻實現(xiàn) public class FEVideoFactory extends VideoFactory { @Override public FEVideo getVideo() { return new FEVideo(); } } //前端視頻 public class FEVideo extends Video { @Override public void produce() { System.out.println("錄制前端視頻"); } }
應(yīng)用與測試類實現(xiàn)
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(); } }
輸出結(jié)果
錄制Java課程視頻 錄制Python課程 錄制前端視頻
實現(xiàn)UML類圖
0x07.源碼中的工廠方法
Collection.iterator()方法
每個集合的具體實現(xiàn)都有一個實現(xiàn)了Iterator的具體實現(xiàn)
Collection.iterator相當(dāng)于是工廠方法
ArrayList中的iterator是其中的內(nèi)部類的實現(xiàn)的工廠
public Iteratoriterator() { return new Itr(); } private class Itr implements Iterator { //省略了具體實現(xiàn) }
使用私有內(nèi)部類來實現(xiàn)具體產(chǎn)品,實現(xiàn)iterator方法,來生成具體的實現(xiàn)。
URLStreamHandlerFactory工廠
log4j, logback---->LoggerFactory
0x08.源碼地址工廠方法模式:https://github.com/sigmako/design-pattern/tree/master/factory-method
0x09.參考慕課網(wǎng)設(shè)計模式精講: https://coding.imooc.com/class/270.html
23種設(shè)計模式(2):工廠方法模式: https://blog.csdn.net/zhengzhb/article/details/7348707
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74755.html
摘要:工廠模式其實可以劃分為簡單工廠模式工廠方法模式抽象工廠模式等。簡單工廠模式介紹簡單工廠模式又稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。此模式是對工廠方法模式的進一步擴展。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試??贾O(shè)計模式——工廠模式周三:PHP面試??贾O(shè)計模式——建造者模式周五:PHP...
摘要:但本質(zhì)是,簡單工廠并未嚴(yán)格遵循設(shè)計模式的開閉原則,當(dāng)需要增加新產(chǎn)品時也需要修改工廠代碼。但是工廠方法則嚴(yán)格遵守開閉原則,模式只負(fù)責(zé)抽象工廠接口,具體工廠交給客戶去擴展。 最近開展了三次設(shè)計模式的公開課,現(xiàn)在來總結(jié)一下設(shè)計模式在PHP中的應(yīng)用,這是第二篇創(chuàng)建型模式之工廠模式。 設(shè)計模式的一般介紹在第一篇文章講了,這里就不重復(fù)。 工廠模式 實現(xiàn):定義一個用于創(chuàng)建對象的接口,讓子類決定實...
摘要:設(shè)計模式之工廠模式工廠模式包括了簡單工廠工廠方法和抽象工廠。工廠方法模式下面我們針對普通工廠模式的缺點進行優(yōu)化。 設(shè)計模式之工廠模式 工廠模式包括了簡單工廠、工廠方法和抽象工廠。下面我從java實際應(yīng)用的角度分別介紹這三種模式。 簡單工廠模式 下面看下JDBC中獲取Connection的代碼 public class ConnectionFactory { public Con...
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的...
摘要:主要詳解簡單工廠模式到抽象工廠模式的演變。抽象工廠模式當(dāng)一個類別的產(chǎn)品還有多個系列區(qū)分時,為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。 主要詳解簡單工廠模式到抽象工廠模式的演變。 簡單工廠模式 即靜態(tài)工廠模式1.將對象的創(chuàng)建和使用分開;2.將生產(chǎn)過程集中,便于集中管理;3.當(dāng)需要創(chuàng)建的對象類有變動時,就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡單工廠模式 ---...
閱讀 3724·2021-11-23 09:51
閱讀 1388·2021-11-10 14:35
閱讀 4026·2021-09-22 15:01
閱讀 1295·2021-08-19 11:12
閱讀 392·2019-08-30 15:53
閱讀 1705·2019-08-29 13:04
閱讀 3442·2019-08-29 12:52
閱讀 3069·2019-08-23 16:14