(一)、什么是工廠方法模式
有一個總工廠負責生產各種電視產品,此時來了一個生產小米電視的需求,就會分配出一個制作小米電視的工廠,然后就能用該工廠生產小米電視了,
上面這種通過工廠來實體化類的方式抽象到設計模式中就是工廠方法模式,
(二)、工廠方法模式中的角色
工廠方法模式中有四種角色,理解這四種角色就能理解工廠方法模式,
抽象工廠(Factory):也就是開題這個例子中的總工廠,抽象工廠是所有具體工廠的基類,在抽象工廠角色中,宣告了生成產品實體的方法,抽象工廠的目的是為了讓實體的生成不再通過new,而是通過生成實體的專用方法
具體工廠(ConcreteFactory):也就是開題這個例子中的制作小米電視的工廠,是抽象工廠的子類,實作抽象工廠中定義的生成產品實體的方法,
抽象產品(Product):也就是開題這個例子中的電視產品,是一個總的抽象產品,定義了一個產品的一系列方法,
具體產品(ConcreteProduct):也就是開題這個例子中的小米電視,是一個具體的產品,實作抽象產品的方法,

(三)、工廠方法模式代碼案例
下面的代碼描述的是工廠方法模式的案例,實作本文第一章的場景
抽象電視工廠類,提供一個produceTv的抽象方法,
public abstract class TvFactory {
public abstract Television produceTv();
}
抽象電視產品類,提供一個show方法,
public abstract class Television {
public abstract void show();
}
具體的電視產品小米電視:
public class XiaomiTelevision extends Television{
@Override
public void show() {
System.out.println("用小米電視看視頻");
}
}
具體工廠:用于生產小米電視:
public class XiaomiTvFactory extends TvFactory{
@Override
public Television produceTv() {
System.out.println("制造了小米電視");
return new XiaomiTelevision();
}
}
最后寫個測驗方法:
public class Main {
public static void main(String[] args) {
Television XiaomiTelevision = new XiaomiTvFactory().produceTv();
XiaomiTelevision.show();
}
}
這個時候又來了一個華為電視的需求,只需要和生產小米電視一樣,生成華為電視具體工廠和華為電視具體類就可以了,如下:
public class HuaweiTvFactory extends TvFactory{
@Override
public Television produceTv() {
System.out.println("制造了一臺華為電視");
return new HuaweiTelevision();
}
}
public class HuaweiTelevision extends Television{
@Override
public void show() {
System.out.println("使用華為電視看視頻");
}
}
然后就可以使用了
public class Main {
public static void main(String[] args) {
Television XiaomiTelevision = new XiaomiTvFactory().produceTv();
XiaomiTelevision.show();
Television HuaweiTelevision = new HuaweiTvFactory().produceTv();
HuaweiTelevision.show();
}
}
(四)、為什么要用工廠方法模式
從上面的例子也能看出來,使用工廠方法模式后代碼變得更加復雜了,并且想在專案中應用上貌似很困難,但是工廠方法模式卻能帶來一些不一樣的東西
1、良好的擴展性
在設計一個專案的時候,首先要設計的是整體的代碼架構,設計了頂層的抽象工廠和抽象產品之后,后續有其他的底層實作時,也只需要新增一個繼承了抽象工廠的具體工廠類就行,
2、良好的封裝性
以前創建一個類需要通過new方法創建,有了工廠類之后,創建的這個動作就交給工廠類去實作類,假設創建一個類的程序很復雜,有許多額外的邏輯,那么這些邏輯只需要在工廠類中實作一次,具體的產品都可以通過工廠類直接獲取到,減少模塊間的耦合,
3、框架和實作的隔離性
我們可以把抽象工廠和抽象產品定義為框架,而具體工廠和具體產品是實作,通過工廠方法模式,框架和實作之間是分離的,實作了底層的修改不會導致上層的改動,
(五)、工廠方法模式在原始碼中的應用
我們來看一下slf4j中是如何應用工廠方法模式的:
首先slf4j定義一個抽象工廠ILoggerFactory
public interface ILoggerFactory {
Logger getLogger(String var1);
}
接著定義了一個抽象產品Logger:
public interface Logger {
... ...
}
具體工廠有很多,都實作了抽象工廠,這里展示其中一個SubstituteLoggerFactory

具體工廠用于生產具體的產品,SubstituteLogger就是一種具體的產品,從上邊的代碼中就可以看到,SubstituteLoggerFactory工廠在生產SubstituteLogger具體產品時,做了一定的處理,而真正使用時,只需要通過getLogger方法就可以得到具體產品,這就是工廠方法模式的魅力,

(六)總結
工廠方法模式相比于配接器模式、迭代器模式或者模板方法模式更加難理解,也更加難應用到專案中,但是我們依舊可以從中學到設計的魅力,學到介面、抽象類存在的目的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342041.html
標籤:其他
上一篇:順序表的實作以及力扣練習題
