版權申明】非商業目的可自由轉載
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86636494
出自:shusheng007
設計模式系列文章:
秒懂Java代理與動態代理模式
秒懂設計模式之建造者模式(Builder Pattern)
秒懂設計模式之簡單工廠模式(Simple Factory Pattern)
秒懂設計模式之抽象工廠模式(Abstract Factory Pattern)
前言
人在IT江湖飄,不懂設計模式咋裝逼?
今天我們一起來看看三種工廠模式,其均爲創建型模式,即討論的是如何創建一個類的對象的問題。說到底就是以各種裝逼的方式最終將一個類的對象new出來。一點也不神祕,如果你發現需要一個類的對象而你又不會這些裝逼神器,那你就直接new好啦,愛誰誰。。。不過你也就逃脫不了永遠是個小白的命運啦,過幾年混不下去了就只能去賣奶茶,什麼?你不想那麼快就去賣奶茶,那就好好學習這些裝逼神器!
定義
Define an interface for creating an object, but let subclasses decide which class to instantiate. The Factory method lets a class defer instantiation it uses to subclasses.
定義一個用於創建對象的接口,讓子類決定實例化哪個類
使用場景
最總要的知識點,這是最總要的知識點,這是最總要的知識點!
首先當然是出現在你需要new一個類的對象的時候,此時各種狀況出現啦:
- 你不想直接new這個類的對象,怕以後這個類改變的時候你需要回來改代碼,而此時依賴這個類的地方到處都是了
- 這個類的對象構建過程很複雜,你不願意將這麼複雜的構建過程一遍又一遍的寫在需要用到此對象的地方。
- 這個類的對象在構建過程中依賴了很多其他的類,而你無法在調用的地方提供
工廠方法模式是簡單工廠方法模式的升級版本,爲了克服簡單工廠方法模式的缺點而生,作用和簡單工廠方法完全一樣。
如何實現
工廠方法模式是通過爲每一種產品生成一個對應的工廠的方式來將簡單工廠方法模式中那個工廠方法給替換掉的。
業務場景
假設我們要生產多種牌子的筆記本電腦,例如要生產小米筆記本電腦和蘋果筆記本電腦,那我們如何用代碼實現這個業務呢?
使用工廠方法模式
第一步:定義一個電腦的抽象基類,裏面有一個爲電腦安裝操作系統的抽象方法。
public abstract class Computer {
public abstract void setOperationSystem();
}
第二步:定義具體品牌的電腦類,蘋果電腦和小米電腦。
public class MacComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("Mac筆記本安裝Mac系統");
}
}
public class MiComputer extends Computer {
@Override
public void setOperationSystem() {
System.out.println("小米筆記本安裝Win10系統");
}
}
第三步:定義工廠,首先定義一個抽象工廠ComputerFactory
接口,裏面規定了生產方法,通過這個方法就可以生產出電腦,但是具體是哪種品牌的電腦需要由具體的實例類決定。例如這裏的生產蘋果電腦的MacComputerFactory
工廠和生產小米電腦的MiComputerFactory
工廠。
public interface ComputerFactory {
Computer makeComputer();
}
public class MacComputerFactory implements ComputerFactory {
@Override
public Computer makeComputer() {
return new MacComputer();
}
}
public class MiComputerFactory implements ComputerFactory {
@Override
public Computer makeComputer() {
return new MiComputer();
}
}
簡單工廠模式中那個靜態工廠方法就被上面的那些工廠類代替了。
第四步:使用工廠來生產電腦,例如要生產Mac電腦,就構建Mac的生產工廠,然後去生產產品。
public static void main(String[] args) {
//生產Mac電腦
ComputerFactory macFactory=new MacComputerFactory();
macFactory.makeComputer().setOperationSystem();
//生產小米電腦
ComputerFactory miFactory=new MiComputerFactory();
miFactory.makeComputer().setOperationSystem();
}
輸出:
Mac筆記本安裝Mac系統
小米筆記本安裝Win10系統
優缺點
優點:不直接在客戶端創建具體產品的實例,降低了耦合性。
缺點:每增加一種產品就要相應的增加一個工廠類,比較繁瑣。
總結
設計模式值得你刻意練習!