GoF之工廠模式

来源:https://www.cnblogs.com/TheMagicalRainbowSea/p/18166760
-Advertisement-
Play Games

GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...


GoF之工廠模式

@

目錄


每博一文案

	蘇東波蘇軾《望江南 超然台作》
休對故人思故國,且將薪火試新茶,詩酒趁年華
休對故人思故國:它告訴我們應當忘記過去。
且將薪火試新茶:又告訴我們要活好當下。
詩酒趁年華:更告訴我們既要面對未來,又要及時努力

1. 簡單說明“23種設計模式”

設計模式:一種可以被重覆利用的解決方案。

GoF(Gang of Four),中文名——四人組。

《Design Patterns: Elements of Reusable Object-Oriented Software》(即《設計模式》一書),1995年由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著。這幾位作者常被稱為"四人組(Gang of Four)"。

該書中描述了23種設計模式。我們平常所說的設計模式就是指這23種設計模式。

不過除了GoF23種設計模式之外,還有其它的設計模式,比如:JavaEE的設計模式(DAO模式、MVC模式等)。

GoF23種設計模式可分為三大類:

一. 創建型(5個):解決對象創建問題。

  1. 單例模式
  2. 工廠方法模式
  3. 抽象工廠模式
  4. 建造者模式
  5. 原型模式

二. 結構型 (7個):一些類或對象組合在一起的經典結構

  1. 代理模式
  2. 裝飾模式
  3. 適配器模式
  4. 組合模式
  5. 享元模式
  6. 外觀模式
  7. 橋接模式

三. 行為型 (11個):解決類或對象之間的交互問題。

  1. 策略模式
  2. 模板方法模式
  3. 責任鏈模式
  4. 觀察者模式
  5. 迭代子模式
  6. 命令模式
  7. 備忘錄模式
  8. 狀態模式
  9. 訪問者模式
  10. 中介者模式
  11. 解釋器模式

而這裡我們該篇的主角“工廠模式” 是解決對象創建問題的,所以工廠模式可以歸屬於創造型設計模式當中。

這裡說明一下,為什麼我們學習 Spring框架,突然就跑過來學習,工廠模式呢?

原因是:在Spring框架底層當中,使用了大量的工廠模式,而學習工廠模式,有利於我們更加透徹的學習Spring,更加瞭解Spring框架的底層原理,從而肆無忌憚的使用Spring。

1.2 介紹工廠模式的三種形態

工廠模式通常有三種形態:

  1. 第一種:簡單工廠模式(Simple Factory):不屬於23種設計模式之一。簡單工廠模式又叫做:靜態工廠方法模式(原因是其中定義的是一個static 靜態的方法,進行工廠處理生產的)。簡單工廠模式是工廠方法模式的一種特殊實現。
  2. 第二種:工廠方法模式(Factory Method):是23種設計模式之一。
  3. 第三種:抽象工廠模式(Abstract Factory):是23種設計模式之一。

1.3 簡單工廠模式(靜態工廠模式)

簡單工廠模式的角色包括三個:

  1. 抽象產品角色
  2. 具體產品角色
  3. 工廠類角色

簡單工廠模式的代碼如下:

抽象產品角色:

抽象產品角色:武器產品,抽象的,自然就是抽象類了 abstract

作用: 用來定義武器的統一的所具備的功能(這裡我們給予上)——攻擊(武器都具備攻擊的功能)


/**
 * 抽象產品角色:武器產品
 * 抽象的,自然就是 抽象類了 abstract
 */
public abstract class Weapon {
    /**
     * 所以的武器都要具備攻擊
     */
    public abstract void attack();
}

具體產品角色:

這裡我們定義兩個具體產品角色(有關武器的具體產品:Dagger 匕首,Tank 坦克)

同時具體產品角色都 extends繼承了 抽象產品角色Weapon,統一上,武器都具備攻擊 attack()

在這裡插入圖片描述




/**
 * 具體產品: 匕首
 * 同樣繼承 Weapon 抽象武器產品,保持同性
 */
public class Dagger extends Weapon{
    @Override
    public void attack() {
        System.out.println("Dagger 匕首攻擊");
    }
}




/**
 * 具體產品角色:坦克
 * 同時具體產品要繼承 抽象武器產品,保持武器的同性
 */
public class Tank extends Weapon {

    @Override
    public void attack() {
        System.out.println("Tank 坦克攻擊");
    }
}

工廠類角色:

抽象工廠類角色:根據不同的武器類型生產武器

註意: 該獲取武器的方法是——靜態方法(static),要獲取什麼產品,就看你傳什麼參數,傳Tank獲取坦克,傳Dagger獲取匕首,
簡單工廠模式中是通過定義一個靜態方法——獲取的,所以又被稱為:靜態工廠方法模式。

在這裡插入圖片描述

在這裡插入圖片描述



/**
 * 抽象工廠類角色:
 * 根據不同的武器類型生產武器
 */
public class WeaponFactory {

    /*
    靜態方法,要獲取什麼產品,就看你傳什麼參數,傳Tank獲取坦克,傳Dagger獲取匕首,
    簡單工廠模式中有一個靜態方法,所以被稱為:靜態工廠方法模式。
     */
    public static Weapon get(String type) {

        // 參數不對,返回 null
        if (null == type || type.length() == 0) {
            return null;
        }

        // 要匕首產品,給匕首
        if ("DAGGER".equals(type)) {
            return new Dagger();
        } else if ("TANK".equals(type)) {  // 要坦克給產品,給坦克
            return new Tank();
        } else {
            throw new RuntimeException("暫時不支持該武器的生產製造");
        }

    }
}

測試程式(客戶端程式):

在這裡插入圖片描述

package com.rainbowsea.test;

import com.rainbowsea.bean.Weapon;
import com.rainbowsea.bean.WeaponFactory;

public class Test {
    public static void main(String[] args) {
        // 我們要坦克
        Weapon tank = WeaponFactory.get("TANK");
        tank.attack();  // 坦克攻擊


        // 我們要匕首,拜托武器工廠給我們製造
        Weapon dagger = WeaponFactory.get("DAGGER");
        dagger.attack(); // 匕首攻擊

    }
}

在這裡插入圖片描述

1.3.1 簡單工廠模式的優缺點:

簡單工廠模式的優點:

客戶端程式不需要關心對象的創建細節,需要哪個對象時,只需要向工廠索要即可,初步實現了責任的分離。客戶端只負責“消費”,工廠負責“生產”。生產和消費分離。

簡單工廠模式的缺點:

  1. 缺點1:工廠類集中了所有產品的創造邏輯,形成一個無所不知的全能類,有人把它叫做上帝類。顯然工廠類非常關鍵,不能出問題,一旦出問題,整個系統癱瘓。
  2. 缺點2:不符合OCP開閉原則,在進行系統擴展時,需要修改工廠類。

在這裡插入圖片描述

說明一下:Spring中的BeanFactory就使用了簡單工廠模式。關於這一點,我們後面會詳細說明

1.4 工廠方法模式

工廠方法模式既保留了簡單工廠模式的優點,同時又解決了簡單工廠模式的缺點。

工廠方法模式的角色包括:

  1. 抽象工廠角色
  2. 具體工廠角色
  3. 抽象產品角色
  4. 具體產品角色

簡單的說:就是一個產品,會對應著一個工廠。

首先,定義好,抽象產品角色,用於統一產品的功能。這裡我們還是以武器 為例子,武器統一都具有攻擊的作用。

在這裡插入圖片描述

/**
 * 武器的抽象產品,
 * 同樣是統一武器,武器都具備攻擊的功能
 */
public abstract class Weapon {

    //
    public abstract void attack();
}

定義具體產品角色,這裡,我們還是以有關武器的具體產品:Dagger 匕首,Tank 坦克)

同時具體產品角色都 extends繼承了 抽象產品角色Weapon,統一上,武器都具備攻擊 attack() 。這一點和簡單工廠模式一致。

在這裡插入圖片描述

/**
 * 具體工廠角色(武器匕首)
 */
public class Dagger extends Weapon{
    @Override
    public void attack() {
        System.out.println("Dagger 匕首攻擊");
    }
}


/**
 * 具體工廠角色(武器坦克)
 */
public class Tank extends Weapon{

    @Override
    public void attack() {
        System.out.println("Tank 坦克攻擊");
    }
}

抽象工廠角色

這裡我們定義一個介面,作為抽象工廠角色,用於約束,生產類的工廠的角色的。都要進行一個生產get() 。需要註意的是:這個方法不是靜態的,是實例方法,這是與簡單工廠模式的一大區別

在這裡插入圖片描述

在這裡插入圖片描述

/**
 * 武器工廠的介面
 * 統一武器工廠的生產
 */
public interface WeaponFactory {
    /**
     * 這個方法不是靜態的,是實例方法,
     * 這裡是簡單工廠模式的最大的區別
     */
    Weapon get();
}

具體工廠角色

這裡是兩個分別為了,生產(Dagger 匕首,Tank 坦克)的具體工廠

  • public class DaggerFactory implements WeaponFactory

  • public class TankFactory implements WeaponFactory

/**
 * 具體工廠角色
 * 生產匕首的工廠
 */
public class DaggerFactory implements WeaponFactory{
    @Override
    public Weapon get() {
        return new Dagger();
    }
}

/**
 * 坦克的具體工廠角色:
 * 專門生產坦克的工廠
 */
public class TankFactory implements WeaponFactory{
    @Override
    public Weapon get() {
        return new Tank();
    }
}

客戶端測試

在這裡插入圖片描述
在這裡插入圖片描述

package com.rainbowsea.test;

import com.rainbowsea.bean.DaggerFactory;
import com.rainbowsea.bean.TankFactory;
import com.rainbowsea.bean.Weapon;
import com.rainbowsea.bean.WeaponFactory;

public class Test {
    public static void main(String[] args) {
        // 我們需要匕首
        // 調用匕首的工廠,進行生產
        WeaponFactory weaponFactory = new DaggerFactory();
        Weapon weapon = weaponFactory.get();
        weapon.attack();  // 匕首攻擊


        // 我們需要坦克
        // 調用坦克的工廠,進行生產
        WeaponFactory weaponFactory2 = new TankFactory();
        Weapon weapon2 = weaponFactory2.get();
        weapon2.attack();  // 坦克攻擊


    }
}

這種簡單工廠模式,如果想擴展一個新的產品,只要新增一個產品類,再新增一個該產品對應的工廠即可,例如新增:戰鬥機

在這裡插入圖片描述

在這裡插入圖片描述

從中,我們可以看出,在進行功能擴展的時候,不需要修改之前的源代碼(僅僅是添加了,擴展的類,對象而已,並沒有修改),顯然工廠方法模式符合OCP原則(修改關閉,擴展打開)。

1.4.1 工廠方法模式的優缺點:

工廠方法模式的優點:

    1. 一個調用者想創建一個對象,只要知道其名稱就可以了。
    2. 擴展性高,如果想要增加一個產品,只需要擴展該產品的一個工廠類就可以了
    3. 同時屏幕產品的具體實現(運用多態機理),調用者只關心產品的介面

工廠方法模式的缺點:

每次增加一個新產品時,都需要增加一個具體類和對象實現工廠,使得系統種類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事情。

1.5 抽象工廠模式

抽象工廠模式相對於工廠方法模式來說,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠類,而抽象工廠模式是多個產品系列一個工廠類。
抽象工廠模式特點:抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。它有多個抽象產品類,每個抽象產品類可以派生出多個具體產品類,一個抽象工廠類,可以派生出多個具體工廠類,每個具體工廠類可以創建多個具體產品類的實例。每一個模式都是針對一定問題的解決方案,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式針對的是多個產品等級結果。
抽象工廠中包含4個角色:

    • 抽象工廠角色
    • 具體工廠角色
    • 抽象產品角色
    • 具體產品角色

抽象工廠模式的類圖如下:

在這裡插入圖片描述

抽象工廠模式代碼如下:
第一部分:武器產品族

package com.powernode.product;

/**
 * 武器產品族
 * @author 動力節點
 * @version 1.0
 * @className Weapon
 * @since 1.0
 **/
public abstract class Weapon {
    public abstract void attack();
}
package com.powernode.product;

/**
 * 武器產品族中的產品等級1
 * @author 動力節點
 * @version 1.0
 * @className Gun
 * @since 1.0
 **/
public class Gun extends Weapon{
    @Override
    public void attack() {
        System.out.println("開槍射擊!");
    }
}
package com.powernode.product;

/**
 * 武器產品族中的產品等級2
 * @author 動力節點
 * @version 1.0
 * @className Dagger
 * @since 1.0
 **/
public class Dagger extends Weapon{
    @Override
    public void attack() {
        System.out.println("砍丫的!");
    }
}

第二部分:水果產品族

package com.powernode.product;

/**
 * 水果產品族
 * @author 動力節點
 * @version 1.0
 * @className Fruit
 * @since 1.0
 **/
public abstract class Fruit {
    /**
     * 所有果實都有一個成熟周期。
     */
    public abstract void ripeCycle();
}
package com.powernode.product;

/**
 * 水果產品族中的產品等級1
 * @author 動力節點
 * @version 1.0
 * @className Orange
 * @since 1.0
 **/
public class Orange extends Fruit{
    @Override
    public void ripeCycle() {
        System.out.println("橘子的成熟周期是10個月");
    }
}
package com.powernode.product;

/**
 * 水果產品族中的產品等級2
 * @author 動力節點
 * @version 1.0
 * @className Apple
 * @since 1.0
 **/
public class Apple extends Fruit{
    @Override
    public void ripeCycle() {
        System.out.println("蘋果的成熟周期是8個月");
    }
}

第三部分:抽象工廠類

package com.powernode.factory;

import com.powernode.product.Fruit;
import com.powernode.product.Weapon;

/**
 * 抽象工廠
 * @author 動力節點
 * @version 1.0
 * @className AbstractFactory
 * @since 1.0
 **/
public abstract class AbstractFactory {
    public abstract Weapon getWeapon(String type);
    public abstract Fruit getFruit(String type);
}

第四部分:具體工廠類

package com.powernode.factory;

import com.powernode.product.Dagger;
import com.powernode.product.Fruit;
import com.powernode.product.Gun;
import com.powernode.product.Weapon;

/**
 * 武器族工廠
 * @author 動力節點
 * @version 1.0
 * @className WeaponFactory
 * @since 1.0
 **/
public class WeaponFactory extends AbstractFactory{

    public Weapon getWeapon(String type){
        if (type == null || type.trim().length() == 0) {
            return null;
        }
        if ("Gun".equals(type)) {
            return new Gun();
        } else if ("Dagger".equals(type)) {
            return new Dagger();
        } else {
            throw new RuntimeException("無法生產該武器");
        }
    }

    @Override
    public Fruit getFruit(String type) {
        return null;
    }
}
package com.powernode.factory;

import com.powernode.product.*;

/**
 * 水果族工廠
 * @author 動力節點
 * @version 1.0
 * @className FruitFactory
 * @since 1.0
 **/
public class FruitFactory extends AbstractFactory{
    @Override
    public Weapon getWeapon(String type) {
        return null;
    }

    public Fruit getFruit(String type){
        if (type == null || type.trim().length() == 0) {
            return null;
        }
        if ("Orange".equals(type)) {
            return new Orange();
        } else if ("Apple".equals(type)) {
            return new Apple();
        } else {
            throw new RuntimeException("我家果園不產這種水果");
        }
    }
}

第五部分:客戶端程式

package com.powernode.client;

import com.powernode.factory.AbstractFactory;
import com.powernode.factory.FruitFactory;
import com.powernode.factory.WeaponFactory;
import com.powernode.product.Fruit;
import com.powernode.product.Weapon;

/**
 * @author 動力節點
 * @version 1.0
 * @className Client
 * @since 1.0
 **/
public class Client {
    public static void main(String[] args) {
        // 客戶端調用方法時只面向AbstractFactory調用方法。
        AbstractFactory factory = new WeaponFactory(); // 註意:這裡的new WeaponFactory()可以採用 簡單工廠模式 進行隱藏。
        Weapon gun = factory.getWeapon("Gun");
        Weapon dagger = factory.getWeapon("Dagger");

        gun.attack();
        dagger.attack();

        AbstractFactory factory1 = new FruitFactory(); // 註意:這裡的new FruitFactory()可以採用 簡單工廠模式 進行隱藏。
        Fruit orange = factory1.getFruit("Orange");
        Fruit apple = factory1.getFruit("Apple");

        orange.ripeCycle();
        apple.ripeCycle();
    }
}

執行結果:
img

1.6 抽象工廠模式的優缺點:

    • 優點: 當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
    • 缺點: 產品族擴展非常困難,要增加一個系列的某一產品,既要在AbstractFactory裡加代碼,又要在具體的裡面加代碼。

2. 總結:

  1. 23種設計模式:

    1. 創建型(5個):解決對象創建問題。
    2. 結構型 (7個):一些類或對象組合在一起的經典結構
    3. 行為型 (11個):解決類或對象之間的交互問題。
  2. 簡單工廠模式(靜態工廠模式),需要註意是:一個靜態方法,所以被稱之為”靜態工廠模式“,不屬於23種設計模式。同時需要註意:簡單工廠的一個上帝類和(違背了OCP原則(修改關閉,苦擴展打開)) 的問題。註意其中的優點和缺點,靈活使用。

  3. 工廠方法模式既保留了簡單工廠模式的優點,同時又解決了簡單工廠模式的缺點(類爆炸問題)。工廠方法模式(不是靜態方法了,是實例方法)。同時其中的優點和缺點,靈活使用。

  4. 抽象工廠模式(解決了工廠方法模式的,類爆炸問題)抽象工廠模式相對於工廠方法模式來說,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的,即工廠方法模式是一個產品系列一個工廠類,而抽象工廠模式是多個產品系列一個工廠類。其中的優點和缺點,靈活使用。

  5. 靈活使用工廠模式的三種形態,處理現實當中的業務需求。

3. 最後:

“在這個最後的篇章中,我要表達我對每一位讀者的感激之情。你們的關註和回覆是我創作的動力源泉,我從你們身上吸取了無盡的靈感與勇氣。我會將你們的鼓勵留在心底,繼續在其他的領域奮鬥。感謝你們,我們總會在某個時刻再次相遇。”

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...