一、簡單工廠模式
一個栗子:
抽象LOL英雄基類,(接口也可以),這是產品的抽象類。
public abstract class Lol { /** * 描述各個英雄 */ public abstract void desc(); }
先說亞索(具體的產品類):
public class Ys extends Lol { @Override public void desc() { System.out.println("哈塞給"); } }
劫(具體的產品類):
public class Jie extends Lol { @Override public void desc() { System.out.println("無形之刃,最為致命"); } }
銳萌萌(具體的產品類):
public class Ruiwen extends Lol { @Override public void desc() { System.out.println("斷劍重鑄之日,,,,"); } }
准備工作做完了,我們來一簡單工廠類,菜單如下:
public class SimpleLolFactory { public static final int TYPE_YS = 1; public static final int TYPE_Jie = 2; public static final int TYPE_RW = 3; public static Lol playWhich(int type) { switch (type) { case TYPE_YS: return new Ys(); case TYPE_Jie: return new Jie(); case TYPE_RW: default: return new Ruiwen(); } } }
/** * 簡單工廠模式 */ Lol lol = SimpleLolFactory.playWhich(SimpleLolFactory.TYPE_RW); lol.desc();
輸出:
斷劍重鑄之日,,,,
缺點
擴展性差(新增英雄,除了新增一個英雄產品類,還需要修改工廠類方法(增加case)),當不同的產品需要不同額外參數的時候 不支持。
二、工廠方法模式 個人理解: 將簡單工廠里的工廠類用繼承的方式細分
2.1 實例概況
- 當客戶需求增加,需要生產另一種產品(B類),但是目前系統只能生產A類產品,此時增加分廠B來生產B類產品
2.2 使用步驟
步驟1: 創建抽象工廠類,定義具體工廠的公共接口
abstract class Factory{ public abstract Product Manufacture(); }
步驟2: 創建抽象產品類 ,定義具體產品的公共接口;
abstract class Product{ public abstract void Show(); }
步驟3: 創建具體產品類(繼承抽象產品類), 定義生產的具體產品;
//具體產品A類 class ProductA extends Product{ @Override public void Show() { System.out.println("生產出了產品A"); } } //具體產品B類 class ProductB extends Product{ @Override public void Show() { System.out.println("生產出了產品B"); } }
步驟4:創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例的方法;
//工廠A類 - 生產A類產品 class FactoryA extends Factory{ @Override public Product Manufacture() { return new ProductA(); } } //工廠B類 - 生產B類產品 class FactoryB extends Factory{ @Override public Product Manufacture() { return new ProductB(); } }
步驟5:外界通過調用具體工廠類的方法,從而創建不同具體產品類的實例
//生產工作流程 public class FactoryPattern { public static void main(String[] args){ //客戶要產品A FactoryA mFactoryA = new FactoryA(); mFactoryA.Manufacture().Show(); //客戶要產品B FactoryB mFactoryB = new FactoryB(); mFactoryB.Manufacture().Show(); } }
結果:
生產出了產品A
生產出了產品C
3、優點
-
新增一種產品時,只需要增加相應的具體產品類和相應的工廠子類即可
簡單工廠模式需要修改工廠類的判斷邏輯(上面提到的 case)
-
符合單一職責原則
每個具體工廠類只負責創建對應的產品簡單工廠中的工廠類存在復雜的switch邏輯判斷
-
不使用靜態工廠方法,可以形成基於繼承的等級結構。
簡單工廠模式的工廠類使用靜態工廠方法
4、缺點
- 添加新產品時,除了增加新產品類外,還要提供與之對應的具體工廠類,系統類的個數將成對增加,在一定程度上增加了系統的復雜度;
- 一個具體工廠只能創建一種具體產品
三、抽象工廠模式
interface IProduct1 { public void show(); } interface IProduct2 { public void show(); } class Product1 implements IProduct1 { public void show() { System.out.println("這是1型產品"); } } class Product2 implements IProduct2 { public void show() { System.out.println("這是2型產品"); } } interface IFactory { public IProduct1 createProduct1(); public IProduct2 createProduct2(); } class Factory implements IFactory{ public IProduct1 createProduct1() { return new Product1(); } public IProduct2 createProduct2() { return new Product2(); } } public class Client { public static void main(String[] args){ IFactory factory = new Factory(); factory.createProduct1().show(); factory.createProduct2().show(); } }
無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極為相似的,他們的最終目的都是為了解耦。所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。