1. 程式人生 > 其它 >Pytorch 預訓練模型的應用

Pytorch 預訓練模型的應用

技術標籤:設計模式設計模式工廠方法模式

工廠方法模式的定義

工廠方法模式(Factory Method Pattern)又叫作多型性工廠模式,指定義一個建立物件的介面,但由實現這個介面的類來決定例項化哪個類,工廠方法把類的例項化推遲到子類中進行。

在工廠方法模式中,不再由單一的工廠類生產產品,而是由工廠類的子類實現具體產品的建立。因此,當增加一個產品時,只需增加一個相應的工廠類的子類,實現生產這種產品,便可以解決簡單工廠生產太多產品導致其內部程式碼臃腫(switch …case分支過多)的問題,也符合開閉原則。

工廠方法模式的應用場景

  1. 建立物件需要大量重複的程式碼。
  2. 客戶端(應用層)不依賴產品類例項如何被建立、實現等細節。
  3. 一個類通過其子類來指定建立哪個物件。

抽象工廠模式主要包含4個角色

  1. 抽象工廠(IFactory):是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。
  2. 具體工廠(ConcreteFactory):是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且被應用程式呼叫以建立產品物件。
  3. 抽象產品(IProduct):是工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。
  4. 具體產品(ConcreteProduct):這個角色實現了抽象產品角色所定義的介面。某具體產品由專門的具體工廠建立,它們之間往往一一對應。

示例

  • 抽象工廠 IFactory
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 抽象工廠
* @Author:      LiGuoGang
* @date:    2021/1/6 20:55
*/
public interface IFactory {
    IProduct createProduct();
}


  • 抽象產品 IProduct
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 抽象產品
* @Author:      LiGuoGang
* @date:    2021/1/6 20:56
*/
public interface IProduct { void productName(); }
  • 具體產品 ProductA
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 具體產品
* @Author:      LiGuoGang
* @date:    2021/1/6 21:03
*/
public class ProductA implements IProduct {
    @Override
    public void productName() {
        System.out.println("product name A");
    }
}

  • 具體產品 ProductB
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 具體產品
* @Author:      LiGuoGang
* @date:    2021/1/6 21:05
*/
public class ProductB implements IProduct {
    @Override
    public void productName() {
        System.out.println("product name B");
    }
}

  • 具體產品 ProductC
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 具體產品
* @Author:      LiGuoGang
* @date:    2021/1/6 21:05
*/
public class ProductC implements IProduct {
    @Override
    public void productName() {
        System.out.println("product name C");
    }
}

  • 生產ProductA產品的具體工廠類
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 生產ProductA產品的具體工廠類
* @Author:      LiGuoGang
* @date:    2021/1/6 21:07
*/
public class FactoryA implements IFactory {
    @Override
    public IProduct createProduct() {
        return new ProductA();
    }
}

  • 生產ProductB產品的具體工廠類
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 生產ProductB產品的具體工廠類
* @Author:      LiGuoGang
* @date:    2021/1/6 21:07
*/
public class FactoryB implements IFactory {
    @Override
    public IProduct createProduct() {
        return new ProductB();
    }
}

  • 生產ProductC產品的具體工廠類
package com.liguogang.FactoryMethodPattern;
/**
* @Description: 生產ProductC產品的具體工廠類
* @Author:      LiGuoGang
* @date:    2021/1/6 21:07
*/
public class FactoryC implements IFactory {
    @Override
    public IProduct createProduct() {
        return new ProductC();
    }
}

  • 測試Test
package com.liguogang.FactoryMethodPattern;

public class Test {
    public static void main(String[] args) {
        IProduct productA = new FactoryA().createProduct();
        productA.productName();

        IProduct productB = new FactoryB().createProduct();
        productB.productName();

        IProduct productC = new FactoryC().createProduct();
        productC.productName();
    }
}

效果:
在這裡插入圖片描述
原始碼地址:https://github.com/lee58/designPattern/tree/master