Pytorch 預訓練模型的應用
阿新 • • 發佈:2021-01-07
工廠方法模式的定義
工廠方法模式(Factory Method Pattern)又叫作多型性工廠模式,指定義一個建立物件的介面,但由實現這個介面的類來決定例項化哪個類,工廠方法把類的例項化推遲到子類中進行。
在工廠方法模式中,不再由單一的工廠類生產產品,而是由工廠類的子類實現具體產品的建立。因此,當增加一個產品時,只需增加一個相應的工廠類的子類,實現生產這種產品,便可以解決簡單工廠生產太多產品導致其內部程式碼臃腫(switch …case分支過多)的問題,也符合開閉原則。
工廠方法模式的應用場景
- 建立物件需要大量重複的程式碼。
- 客戶端(應用層)不依賴產品類例項如何被建立、實現等細節。
- 一個類通過其子類來指定建立哪個物件。
抽象工廠模式主要包含4個角色
- 抽象工廠(IFactory):是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。
- 具體工廠(ConcreteFactory):是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且被應用程式呼叫以建立產品物件。
- 抽象產品(IProduct):是工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。
- 具體產品(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