工廠模式
簡單工廠模式(不屬于23種設計模式之一)
- 屬于建立型模式,是工廠模式的一種。簡單工廠模式是由一個工廠對象決定建立出哪一種産品類的執行個體。簡單工廠模式是工廠模式家族中最簡單實用的模式;
- 簡單工廠模式:定義了一個建立對象的類,由這個類來封裝執行個體化對象的行為;
- 使用場景:在軟體開發中,當我們會用到大量的建立某種、某類或者某批對象時,就會使用到工廠模式。
例子:
/**
* 運算類:有一個抽象方法
*/
public abstract class Operation {
public double number1;
public double number2;
public abstract double result();
}
/**
* 加法類,繼承運算類并且重寫父類方法
*/
public class OperationAdd extends Operation {
@Override
public double result() {
return number1 + number2;
}
}
/**
* 減法類,繼承運算類并且重寫父類方法
*/
public class OperationSub extends Operation {
@Override
public double result() {
return number1 - number2;
}
}
/**
* 建立一個簡單工廠
*/
public class OpreationFactory {
public static Operation createOperate(String operate){
Operation operation = null;
switch (operate){
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
default:
System.out.println("您輸入的運算符有誤!");
}
return operation;
}
}
/**
* 測試類
*/
public class Calculator {
public static void main(String[] args) {
Operation operation;
String operator;
operator = "-";
operation = OpreationFactory.createOperate(operator);
operation.number1 = 10;
operation.number2 = 8;
System.out.println(operation.result());
}
}
優缺點:
- 優點:簡單易懂
- 缺點:違背了開閉原則
工廠方法模式
- 工廠方法模式:定義了一個建立對象的抽象方法,由子類決定要執行個體化的類。工廠方法模式将對象的執行個體化推遲到子類。
例子:還是上面的運算例子,如果需要添加一個乘法運算的話,除了要添加一個乘法類繼承運算類,還需要修改工廠代碼添加一個判斷,是以簡單工廠模式違背了開閉原則。使用工廠模式的話隻需要添加一個乘法類繼承運算類以及添加一個乘法工廠實作工廠接口就可以了,完美的遵循開閉原則,代碼如下:
/**
* 工廠方法
*/
public interface IFactory {
Operation createOperation();
}
/**
* 加法工廠,實作了工廠方法接口
*/
public class AddFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationAdd(); //該類見上面簡單工廠方法
}
}
/**
* 減法工廠,實作了工廠方法接口
*/
public class SubFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationSub(); //該類見上面簡單工廠方法
}
}
/**
* 乘法工廠,實作了工廠方法接口
*/
public class MultiFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationMulti();
}
}
/**
* 乘法類,繼承運算類并且重寫父類方法
*/
public class OperationMulti extends Operation{
@Override
public double result() {
return number1 * number2;
}
}
/**
* 測試類
*/
public class Calculator {
public static void main(String[] args) {
Operation operation;
IFactory factory = new MultiFactory();
operation = factory.createOperation();
operation.number1 = 2;
operation.number2 = 3;
System.out.println(operation.result());
}
}
優缺點:
- 優點:遵循了開閉原則
- 缺點:類的個數容易過多,增加了系統的複雜度
抽象工廠模式
- 抽象工廠模式:定義了一個 interface 用于建立相關或有依賴關系的對象簇,而無需指明具體的類。
- 抽象工廠模式可以将簡單工廠模式和工廠方法模式進行整合。
- 從設計層面看,抽象工廠模式就是對簡單工廠模式的改進(或者進一步的抽象)。
- 将工廠抽象成兩層,AbsFactory(抽象工廠)和具體實作的工廠子類。
優缺點:
- 優點:讓具體的建立執行個體過程與用戶端分離,用戶端是通過它們的抽象接口操縱執行個體,産品的具體類名也被具體工廠的實作分離,不會出現在客戶代碼中。
- 缺點:如果要添加一個産品類,就得增加很多代碼
工廠模式在JDK中的應用
- JDK中,Calendar類就是使用的簡單工廠模式
總結
- 工廠模式的意義:将執行個體化對象的代碼提取出來,放到一個類中統一管理和維護,達到和主項目的依賴關系的解耦,進而提高了項目的擴充性和維護性。
- 三種工廠模式(簡單工廠模式、工廠模式、抽象工廠模式)的差別:
- 簡單工廠模式:不符合開閉原則,隻有一個具體的工廠類,當需要增加一個産品時,需要修改工廠代碼
- 工廠模式:符合開閉原則,隻有一個抽象的産品類,隻能生産單一産品。
- 抽象工廠模式:符合開閉原則,有多個抽象産品類,能生産一個産品體系
- 設計模式的依賴抽象原則
- 建立對象執行個體時,不要直接 new 類,而是把這個 new 類的動作放在一個工廠方法中,并傳回;
- 不要讓類繼承具體類,而是繼承抽象類或者是實作接口;
- 不要覆寫基類中已經實作的方法。