1. 程式人生 > >【設計模式系列-建立型模式篇】-工廠方法模式

【設計模式系列-建立型模式篇】-工廠方法模式

工廠方法模式定義

工廠方法模式的使用頻率非常高,在我們日常的開發過程中總能見到它的身影。其定義為:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。

工廠方法模式應用場景

工廠方法模式是通過new關鍵字建立物件的替代品,所有需要生產物件的地方都可以使用,但是需要慎重考慮是否要增加一個工廠類進行管理,因為這勢必會增加程式碼的複雜度。

工廠方法模式應用例項

/**
 * 抽象運算類
 */
public abstract class Operation {

    // 兩個數之間的運算
    public abstract double operate(double a,double b);

}
/**
 * 加法實現類
 */
public class AddOperation extends Operation {

    @Override
    public double operate(double a, double b) {
        return a + b;
    }
}
/**
* 減法實現類 */ public class SubOperation extends Operation { @Override public double operate(double a, double b) { return a - b; } }
/**
 * 乘法實現類
 */
public class MulOperation extends Operation {

    @Override
    public double operate(double a, double b) {
        return a * b;
    }
}
/**
 * 除法實現類
 */
public class DivOperation extends Operation {

    @Override
    public double operate(double a, double b) {
        if (b != 0){
            return a/b;
        }
        return 0;
    }
}
/**
 * 抽象運算工廠類
 */
public abstract class AbstractOperationFactory {

    public abstract <T extends Operation> T createOperation(Class <T> c);
}
/**
 * 具體工廠實現
 */
public class OperationFactory extends AbstractOperationFactory {

    @Override
    public <T extends Operation> T createOperation(Class <T> c) {
        Operation operation = null;
        try {
            operation = (Operation) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("獲取運算類異常");
        }
        return (T) operation;
    }
}
/**
 * 測試類
 */
public class MainTest {

    @Test
    public void test(){

        AbstractOperationFactory abstractOperationFactory = new OperationFactory();
        Operation addOperation = abstractOperationFactory.createOperation(AddOperation.class);
        System.out.println(addOperation.operate(1,2));
        Operation subOperation = abstractOperationFactory.createOperation(SubOperation.class);
        System.out.println(subOperation.operate(3,2));
        Operation mulOperation = abstractOperationFactory.createOperation(MulOperation.class);
        System.out.println(mulOperation.operate(2,4));
        Operation divOperatipon = abstractOperationFactory.createOperation(DivOperation.class);
        System.out.println(divOperatipon.operate(6,3));
    }
}

通過這個例項可以體驗工廠方法模式的優點:

1、良好的封裝性,程式碼結構清晰,一個物件的建立是有條件約束的,呼叫著需要獲取一個具體的產品物件,只要知道這個產品的類名就可以了,不用知道建立物件等等艱辛過程,降低模組間的耦合。

2、良好的擴充套件性,在增加產品類的情況下,只要適當修改具體工廠類或擴充套件一個工廠類,就可以輕鬆擁抱變化。

3、遮蔽產品類,產品類的實現如何變化,呼叫者都不需要關心,只需要關心產品類的介面,只要介面不變,系統中的上層模組就不要發生變化。

4、工廠方法模式是典型的解耦框架,高層模組只需要知道產品的抽象類,其他的實現類都不用關心。