🌲本文收錄于專欄《原始碼中的設計模式》——理論與實戰的完美結合
作者其它優質專欄推薦:
📚《技術專家修煉》——搞技術,進大廠,聊人生三合一專欄
📚《leetcode 300題》——每天一道演算法題,進大廠必備
📚《糊涂演算法》——從今天起,邁過資料結構和演算法這道坎
📚《從實戰學python》——Python的爬蟲,自動化,AI等實戰應用(代碼開源)
點擊跳轉到文末領取粉絲福利
哈嘍,大家好,我是一條~
國慶正是彎道超車的時候,向大家推薦一本個人覺得寫的非常好的書——《redis深度歷險 核心原理與應用實踐》,
我們接著聊設計模式,新同學可以先看一下《23種設計模式的一句話通俗解讀》全面的了解一下設計模式,形成一個整體的框架,再逐個擊破,
往期回顧:原型模式、建造者模式
今天我們一塊看一下簡單工廠模式,其實他不屬于23種設計模式,但為了更好的理解后面的工廠方法和抽象工廠,我們還是需要先了解一下,

定義
官方定義
定義一個工廠類,他可以根據引數的不同回傳不同類的實體,被創建的實體通常都具有共同的父類,
通俗解讀
我們不必關心物件的創建細節,只需要根據不同引數獲取不同產品即可,
難點:寫好我們的工廠,
結構圖

代碼演示
本文原始碼:簡單工廠模式原始碼 提取碼: qr5h
目錄結構
建議跟著一條學設計模式的小伙伴都建一個maven工程,并安裝lombok依賴和插件,
并建立如下包目錄,便于歸納整理,

pom如下
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
開發場景
汽車制造工廠,既可以生產跑車,也可以生產SUV,未來還會生產新能源汽車,
代碼實作
1.創建抽象產品Car
public abstract class Car {
public String color;
abstract void run();
}
2.創建具體產品
SuvCar
public class SuvCar extends Car{
public SuvCar(){
this.color="green";
}
@Override
public void run() {
System.out.println("SuvCar running---------");
}
}
SportsCar
public class SportsCar extends Car{
public SportsCar(){
this.color="red";
}
@Override
public void run() {
System.out.println("SportsCar running-------");
}
}
3.創建靜態工廠
在簡單工廠模式中用于被創建實體的方法通常為靜態方法,因此簡單工廠模式又被成為靜態工廠方法(Static Factory Method),
/**
* 簡單/靜態工廠,少數產品
*/
public class CarFactory {
public static Car getCar(String type){
if (type.equals("sport")){
return new SportsCar();
}else if (type.equals("suv")){
return new SuvCar();
}else {
return null;
}
}
}
4.撰寫測驗類
public class MainTest {
public static void main(String[] args) {
SportsCar sport = (SportsCar) CarFactory.getCar("sport");
sport.run();
System.out.println(sport.color);
}
}
5.輸出結果

介面和抽象類
補充一個知識:
介面和抽象類有什么區別?
什么時候用介面,什么時候用抽象類?
介面和抽象類有什么區別?
- 介面是針對方法的整合,抽象類是針對子類的整合,
- 人有男人,女人,人是抽象類,人可以吃東西,狗也可以吃東西,吃東西這個動作是介面,
- 介面可以多繼承,抽象類不行,
- 介面中基本資料型別為
static, 而抽類象不是, - 抽象類有構造器,方法可以實作,除了不能被實體化,和普通類沒有區別,介面不是,
什么時候用介面,什么時候用抽象類?
- 當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用介面,
- 再簡單點說,有屬性定義的時候,用抽象類,只有方法的時候,用介面,
應用場景
-
工廠類負責創建對的物件比較少,因為不會造成工廠方法中的業務邏輯過于復雜
-
客戶端只知道傳入工廠類的引數,對如何創建物件不關心
-
由于簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用,
總結
優點
- 通過工廠類,無需關注生產的細節,只需要傳遞對應引數即可,
- 可以引入組態檔,在不修改客戶端代碼的情況下更換和添加新的具體產品類,
缺點
- 違背開閉原則,擴展不易,
- 工廠類職責過重,一旦例外,系統癱瘓,
- 無法動態的增加產品,擴展困難,
問題:在不修改的工廠的前提下,怎么生產新能源汽車?下一節的工廠方法模式給大家講解,
粉絲福利
📚Java:1.5G學習資料——回復「資料」
📚演算法:視頻書籍——回復「演算法」
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/305675.html
標籤:java
下一篇:架構之美:教你如何分析一個介面?
