簡單工廠模式(靜態工廠),工廠方法模式,抽象工廠模式

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、工廠方法模式    我的理解: 將簡單工廠裏的工廠類用繼承的方式細分接口

2.1 實例概況

  • 當客戶需求增長,須要生產另外一種產品(B類),可是目前系統只能生產A類產品,此時增長分廠B來生產B類產品

2.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();  
    }  
}

 不管是簡單工廠模式,工廠方法模式,仍是抽象工廠模式,他們都屬於工廠模式,在形式和特色上也是極爲類似的,他們的最終目的都是爲了解耦。因此,在使用工廠模式時,只須要關心下降耦合度的目的是否達到了。

相關文章
相關標籤/搜索