簡單工廠模式

begin 2018年8月19日19:44:25html

簡單工廠模式

定義

只要你說的,只要我有,我都給你。java

簡單工廠模式(Simple Factory Pattern):又稱爲靜態工廠方法(Static Factory Method)模式。設計模式分爲建立型模式、結構型模式、行爲型模式,簡單工廠模式屬於建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。設計模式

角色

工廠角色(Factory):工廠角色負責實現建立全部實例的內部邏輯ide

抽象產品角色(Product):抽象產品角色是所建立的全部對象的父類,負責描述全部實例的公共接口測試

具體產品角色(ConcreteProduct):最終被建立的對象設計

類圖

簡單工廠模式

時序圖

簡單工廠模式
(不知道畫的對不對)code

代碼示例

抽象產品角色(IOperation.java):htm

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: IOperation
 * @Description: 運算操做接口
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:43:14
 */
public interface IOperation {
    public int getResult(int a, int b);
}

簡單工廠模式所建立的實例的公共接口:運算操做接口。對象

具體產品角色(AddOperationImpl.java、SubOperationImpl.java、MulOperationImpl.java、DivOperationImpl.java):blog

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: AddOperationImpl
 * @Description: 加運算實現類
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:46:25
 */
public class AddOperationImpl implements IOperation{

    @Override
    public int getResult(int a, int b) {
        return a + b;
    }

}

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: SubOperationImpl
 * @Description: 減運算實現類
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:48:55
 */
public class SubOperationImpl implements IOperation {
    
    @Override
    public int getResult(int a, int b) {
        return a - b;
    }
}

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: MulOperationImpl
 * @Description: 乘運算實現類
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:52:04
 */
public class MulOperationImpl implements IOperation {

    @Override
    public int getResult(int a, int b) {
        return a * b;
    }

}

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: DivOperationImpl
 * @Description: 減運算實現類
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:52:48
 */
public class DivOperationImpl implements IOperation {

    @Override
    public int getResult(int a, int b) {
        return a / b;
    }

}

被建立的具體對象:加減乘除運算操做。

工廠角色(SimpleFactory.java):

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: SimpleFactory
 * @Description: 簡單工廠類
 * @author: luhaoming
 * @date: 2018年8月19日 下午4:54:20
 */
public class SimpleFactory {

    public static IOperation createOperation(String op) {
        IOperation operation = null;
        // 一、適用範圍有限:byte、short、char、int及其包裝類,還有Enum、String
//      switch(op){
//      case "+":
//          operation = new AddOperationImpl();
//          break;
//      case "-":
//          operation = new SubOperationImpl();
//          break;
//      case "*":
//          operation = new MulOperationImpl();
//          break;
//      case "/":
//          operation = new DivOperationImpl();
//          break;
//      }
        
        // 二、全部對象
        if ("+".equals(op)) {
            operation = new AddOperationImpl();
        } else if ("-".equals(op)) {
            operation = new SubOperationImpl();
        } else if ("*".equals(op)) {
            operation = new MulOperationImpl();
        } else if ("/".equals(op)) {
            operation = new DivOperationImpl();
        }
        
        return operation;
    }
}

負責建立對象的工廠,經過String類型的「+」、「-」、「*」、「」來區分實例化哪一個對象,這個判斷標誌你能夠設置爲你想的任何東西,中文的「加」、「減」、「乘」、「除」也是能夠的。

測試類(SimpleFactoryTest.java):

package com.mingmingcome.designpattern.factory.simplefactory;

/** 
 * @className: SimpleFactoryTest
 * @Description: 簡單工廠模式測試類
 * @author: luhaoming
 * @date: 2018年8月19日 下午5:05:36
 */
public class SimpleFactoryTest {
    
    public static void main(String[] args) {
        int a = 999, b = 888;
        // 加
        IOperation operation = SimpleFactory.createOperation("+");
        int add = operation.getResult(a, b);
        System.out.println("a '+' b:" + add);
        // 減
        operation = SimpleFactory.createOperation("-");
        operation.getResult(a, b);
        int sub = operation.getResult(a, b);
        System.out.println("a '-' b:" + sub);
        // 乘
        operation = SimpleFactory.createOperation("*");
        operation.getResult(a, b);
        int mul = operation.getResult(a, b);
        System.out.println("a '*' b:" + mul);
        // 除
        operation = SimpleFactory.createOperation("/");
        operation.getResult(a, b);
        int div = operation.getResult(a, b);
        System.out.println("a '/' b:" + div);
    }
}

優勢

一、工廠類含有必要的判斷邏輯,能夠決定在何時建立哪個產品類的實例,客戶端能夠免除直接建立產品對象的責任,而僅僅「消費」產品;簡單工廠模式經過實現了對責任的分割,它提供了專門的工廠類用於建立對象。

二、客戶端無須知道所建立的具體產品類的類名,只須要知道產品類所對應的參數便可,對於一些複雜的類名,經過簡單工廠模式能夠減小使用者的記憶量。本文中客戶端只須要記住「+」、「—」、「*」、「/」就好了。

三、經過引入配置文件,能夠在不修改任何客戶端代碼的狀況下更換和增長新的具體產品類,在必定程度上提升了系統的靈活性。(本文未實現此優勢,挖坑)

缺點

一、因爲工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。

二、使用簡單工廠模式將會增長系統中類的個數,在必定程度上增長了系統的複雜度和理解難度。

三、系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較可能是,有可能形成工廠邏輯過於複雜,不利於系統的擴展和維護。

四、簡單工廠模式因爲使用了靜態工廠方法,形成工廠角色沒法造成基於繼承的等級結構。

使用場景

工廠類負責建立的對象比較少。

總結

簡單工廠模式:客戶端不須要知道具體建立什麼對象,只須要知道參數便可。工廠類負責邏輯判斷建立具體對象,具體產品對象包含着具體實現邏輯。抽象產品類爲具體產品對象類提供同一接口。

參考:

簡單工廠模式( Simple Factory Pattern )

2018年8月21日18:36:51

相關文章
相關標籤/搜索