工廠設計模式-三種實現方式
工廠設計模式說明
一、簡單工廠模式 Simple Factory
簡單工廠模式沒有被歸類到常見23種設計模式中,此處主要是和工廠方法、抽象工廠對比,方便理解。
簡單工廠模式:把對象的創建放到一個工廠類中,通過參數來創建不同的對象。
1.1案例代碼
角色組成
- 抽象產品:定義了抽象產品具有的基本操作
- 產品實現類:實現抽象產品類對定義的抽象方法
- 生產工廠:不同的參數生成具體的產品對象
/**
* 抽象產品: 配置接口
*/
interface OSSConfig {
/**
* 初始化OSS配置
*/
void init();
}
/**
* 具體產品: 阿里雲OSS配置
*/
class AlibabaOSSConfig implements OSSConfig {
@Override
public void init() {
System.out.println("初始化--阿里雲--OSS配置");
}
}
/**
* 具體產品: 騰訊雲OSS配置
*/
class TencentOSSConfig implements OSSConfig {
@Override
public void init() {
System.out.println("初始化--騰訊雲--OSS配置");
}
}
/**
* 簡單工廠類
*/
public class SimpleFactory {
/**
* 生產工廠
*/
public static OSSConfig createOSSConfig(String name) {
OSSConfig config = null;
switch (name) {
case "alibaba":
config = new AlibabaOSSConfig();
break;
case "tencent":
config = new TencentOSSConfig();
break;
default:
break;
}
return config;
}
public static void main(String[] args) {
OSSConfig alibabaConifg = SimpleFactory.createOSSConfig("alibaba");
alibabaConifg.init();
OSSConfig tencentConfig = SimpleFactory.createOSSConfig("tencent");
tencentConfig.init();
}
}
二、工廠方法模式 Factory Method
工廠方法模式: 每種產品由一種工廠來創建,一個工廠處理一個對象。
- 一個抽象產品類,可以派生出多個具體產品類。
- 一個抽象工廠類,可以派生出多個具體工廠類。
- 每個具體工廠類只能創建一個具體產品類的實例。
2.1案例代碼
角色組成
- 抽象工廠: 定義工廠類所具有的基本的操作
- 具體工廠:該類必須繼承抽象工廠,實現抽象工廠定義的方法,返回一個對象
- 抽象產品:定義了抽象產品具有的基本操作
- 產品實現類:實現抽象產品類對定義的抽象方法,和具體工廠一一對應
/**
* 抽象產品: 配置接口
*/
interface OSSConfig {
/**
* 初始化OSS配置
*/
void init();
}
/**
* 具體產品: 阿里雲OSS配置
*/
class AlibabaOSSConfig implements OSSConfig {
@Override
public void init() {
System.out.println("初始化--阿里雲--OSS配置");
}
}
/**
* 具體產品: 騰訊雲OSS配置
*/
class TencentOSSConfig implements OSSConfig {
@Override
public void init() {
System.out.println("初始化--騰訊雲--OSS配置");
}
}
/**
* 抽象工廠
*/
interface Factory {
OSSConfig createOSSConfig();
}
/**
* 具體工廠: 騰訊雲工廠
*/
class TencentOSSFactory implements Factory {
@Override
public OSSConfig createOSSConfig() {
return new TencentOSSConfig();
}
}
/**
* 具體工廠: 騰訊雲工廠
*/
class AlibabaOSSFactory implements Factory {
@Override
public OSSConfig createOSSConfig() {
return new AlibabaOSSConfig();
}
}
/**
* 工廠設計模擬類
*/
public class FactoryMethod {
public static void main(String[] args) {
AlibabaOSSFactory alibabaOSSFactory = new AlibabaOSSFactory();
OSSConfig alibabaConifg = alibabaOSSFactory.createOSSConfig();
alibabaConifg.init();
TencentOSSFactory tencentOSSFactory = new TencentOSSFactory();
OSSConfig tencentConfig = tencentOSSFactory.createOSSConfig();
tencentConfig.init();
}
}
三、抽象工廠模式 Abstract Factory
抽象工廠模式:工廠方法模式的進一步延伸
- 多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。
- 一個抽象工廠類,可以派生出多個具體工廠類。
- 每個具體工廠類可以創建多個具體產品類的實例。
3.1案例代碼
角色組成
- 抽象工廠: 定義工廠類所具有的基本的操作
- 具體工廠:具體工廠實現了抽象工廠,每個工廠方法返回多個具體對象
- 抽象類接口:定義了產品具有的基本操作,提供一組所有類都具有的業務方法
- 抽象類:用於實現抽象接口所定義的業務方法,只做抽象接口,具體由產品實現類處理
- 產品實現類:實現抽象產品類對定義的抽象方法,和具體工廠一對多
/**
* 抽象產品: 配置接口
*/
interface OSSConfig {
/**
* 初始化OSS配置
*/
void init();
}
/**
* 具體產品: 阿里雲OSS配置
*/
abstract class AlibabaOSSConfig implements OSSConfig {
public abstract void init();
}
/**
* 具體產品: 阿里雲OSS配置Test環境
*/
class AlibabaTstOSSConfig implements OSSConfig {
@Override
public void init() {
System.out.println("初始化--阿里雲--test環境--OSS配置");
}
}
/**
* 具體產品: 阿里雲OSS配置生產環境
*/
class AlibabaPreOSSConfig implements OSSConfig {
@Override
public void init() {
System.out.println("初始化--阿里雲--Pre環境--OSS配置");
}
}
/**
* 具體產品: 騰訊雲OSS配置
*/
class TencentOSSConfig implements OSSConfig {
@Override
public void init() {
System.out.println("初始化--騰訊雲--OSS配置");
}
}
/**
* 抽象工廠
*/
interface Factory {
/**
* 獲取測試環境配置
*/
OSSConfig createOSSTestConfig();
/**
* 獲取生成環境配置
*/
OSSConfig createOSSPreConfig();
}
/**
* 具體工廠: 騰訊雲工廠
*/
class TencentOSSFactory implements Factory {
@Override
public OSSConfig createOSSTestConfig() {
return null;
}
@Override
public OSSConfig createOSSPreConfig() {
return new TencentOSSConfig();
}
}
/**
* 具體工廠: 騰訊雲工廠
*/
class AlibabaOSSFactory implements Factory {
@Override
public OSSConfig createOSSTestConfig() {
return new AlibabaTstOSSConfig();
}
@Override
public OSSConfig createOSSPreConfig() {
return new AlibabaPreOSSConfig();
}
}
/**
* 工廠設計模擬類
*/
public class AbstractFactory {
public static void main(String[] args) {
AlibabaOSSFactory alibabaOSSFactory = new AlibabaOSSFactory();
OSSConfig alibabaConifg = alibabaOSSFactory.createOSSPreConfig();
alibabaConifg.init();
OSSConfig alibabaTestConifg = alibabaOSSFactory.createOSSTestConfig();
alibabaTestConifg.init();
TencentOSSFactory tencentOSSFactory = new TencentOSSFactory();
OSSConfig tencentConifg = tencentOSSFactory.createOSSPreConfig();
tencentConifg.init();
}
}
四、工廠模式和抽象工廠模式對比
區別:
工廠方法模式:具體工廠類只能創建一個具體產品類的實例
抽象工廠模式:具體工廠類可以創建多個具體產品類的實例。