1. 程式人生 > >設計模式之工廠方法模式

設計模式之工廠方法模式

spa 分享 web his method 解答 優點 邏輯 dml

今天楊哥給小夥伴們帶來了工廠方法設計模式,那麽小夥們就有一個疑問了,工廠方法設計模式和之前楊哥所講的工廠模式有何區別呢,是不是同一個呢,現在楊哥為小夥們解答這個疑問,先上兩個圖:

第一個圖是工廠模式UML類圖

技術分享

第二個圖是工廠方法UML類圖:

技術分享

根據兩幅圖所示,工廠方法多了幾個具體的工廠類。其實之前的工廠模式最大的優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了具體的產品(加法類或其它類)的依賴。只要把"+"傳給工廠類,工廠自動返回相應的實例做不同的運算功能。但問題也就在這裏,如果想再加上一種運算方式,那就要去修改工廠類,需求的變化會去修改原來的類,這實在不太好,不靈活,違背了程序設計中的開放-封閉原則。所以呢,工廠方法設計模式應運而生啊,楊哥先上代碼再說:

運算類

package factorymethod_designmode;

//運算類

public class Operation {

public double get_numberA() {

return _numberA;

}

public void set_numberA(double _numberA) {

this._numberA = _numberA;

}

public double get_numberB() {

return _numberB;

}

public void set_numberB(double _numberB) {

this._numberB = _numberB;

}

private double _numberA = 0;

private double _numberB = 0;

/// 得到運算結果

public double getResult()

{

double result = 0;

return result;

}

}

幾種具體的計算類

/// <summary>

/// 加法類

/// </summary>

class OperationAdd extends Operation

{

public double getResult()

{

double result = 0;

result = get_numberA() + get_numberB();

return result;

}

}

/// <summary>

/// 減法類

/// </summary>

class OperationSub extends Operation

{

public double getResult()

{

double result = 0;

result = get_numberA() - get_numberB();

return result;

}

}

/// <summary>

/// 乘法類

/// </summary>

class OperationMul extends Operation

{

public double getResult()

{

double result = 0;

result = get_numberA() * get_numberB();

return result;

}

}

/// <summary>

/// 除法類

/// </summary>

class OperationDiv extends Operation

{

public double getResult()

{

double result = 0;

if (get_numberB()==0)

try {

throw new Exception("除數不能為0。");

} catch (Exception e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

result = get_numberA() / get_numberB();

return result;

}

}

工廠方法接口

package factorymethod_designmode;

//工廠方法

public interface IFactory {

Operation CreateOperation();

}

幾個具體的工廠類

// 專門負責生產“+”的工廠

class AddFactory implements IFactory

{

public Operation CreateOperation()

{

return new OperationAdd();

}

}

// 專門負責生產“-”的工廠

class SubFactory implements IFactory

{

public Operation CreateOperation()

{

return new OperationSub();

}

}

// 專門負責生產“*”的工廠

class MulFactory implements IFactory

{

public Operation CreateOperation()

{

return new OperationMul();

}

}

// 專門負責生產“/”的工廠

class DivFactory implements IFactory

{

public Operation CreateOperation()

{

return new OperationDiv();

}

}

程序的入口:

技術分享

其實啊楊哥要告訴小夥伴的是工廠方法設計模式定義了一個用於創建對象的接口,讓子類決定實例化哪一個具體的類,工廠方法使一個類的實例化延遲到其子類。如圖詮釋

技術分享

楊哥講工廠方法設計模式就這麽簡單易懂,呵呵,覺得楊哥說的有道理的小夥們可以給楊哥點個贊,說個評論哦。

設計模式之工廠方法模式