1、簡單工廠模式php
一個栗子:
抽象LOL英雄基類,(接口也能夠),這是產品的抽象類。java
public abstract class Lol { /** * 描述各個英雄 */ public abstract void desc(); }
先說亞索(具體的產品類):ide
public class Ys extends Lol { @Override public void desc() { System.out.println("哈塞給"); } }
劫(具體的產品類):ui
public class Jie extends Lol { @Override public void desc() { System.out.println("無形之刃,最爲致命"); } }
銳萌萌(具體的產品類):spa
public class Ruiwen extends Lol { @Override public void desc() { System.out.println("斷劍重鑄之日,,,,"); } }
準備工做作完了,咱們來一簡單工廠類,菜單以下:code
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();
輸出:blog
斷劍重鑄之日,,,,
擴展性差(新增英雄,除了新增一個英雄產品類,還須要修改工廠類方法(增長case)),當不一樣的產品須要不一樣額外參數的時候 不支持。繼承
2、工廠方法模式 我的理解: 將簡單工廠裏的工廠類用繼承的方式細分接口
步驟1: 建立抽象工廠類,定義具體工廠的公共接口string
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
新增一種產品時,只須要增長相應的具體產品類和相應的工廠子類便可
簡單工廠模式須要修改工廠類的判斷邏輯(上面提到的 case)
符合單一職責原則
每一個具體工廠類只負責建立對應的產品
簡單工廠中的工廠類存在複雜的switch邏輯判斷
不使用靜態工廠方法,能夠造成基於繼承的等級結構。
簡單工廠模式的工廠類使用靜態工廠方法
3、抽象工廠模式
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(); } }
不管是簡單工廠模式,工廠方法模式,仍是抽象工廠模式,他們都屬於工廠模式,在形式和特色上也是極爲類似的,他們的最終目的都是爲了解耦。因此,在使用工廠模式時,只須要關心下降耦合度的目的是否達到了。