
一. 基本概念
- 定義
- 實(shí)例化對象,用工廠方法代替new操作
- 工廠模式包括工廠方法模式和抽象工廠模式
- 抽象工廠模式是工廠方法模式的擴(kuò)展
- 意圖
- 定義一個(gè)接口來創(chuàng)建對象,但是讓子類來決定那些類需要被實(shí)例化
- 工廠方法把實(shí)例化的工作推遲到子類中去實(shí)現(xiàn)
- 什么情況適合工廠模式
- 有一組類似的對象需要?jiǎng)?chuàng)建
- 在編碼時(shí)不能預(yù)見需要?jiǎng)?chuàng)建那種類的實(shí)例
- 系統(tǒng)需要考慮擴(kuò)展性,不應(yīng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)
- 項(xiàng)目中的現(xiàn)狀:
- 在軟件系統(tǒng)中經(jīng)常面臨著“對象”創(chuàng)建的工作,由于需求的變化,這個(gè)對象可能隨之也會(huì)發(fā)生變化,但它卻擁有比較穩(wěn)定的接口
- 我們需要提供一種封裝機(jī)制來隔離出這個(gè)易變對象的變化,從而保持系統(tǒng)中其他依賴,該對象的對象不隨著需求的變化而變化
- 基于項(xiàng)目現(xiàn)狀將代碼進(jìn)行如下設(shè)計(jì):
- 盡量松耦合,一個(gè)對象的依賴對象的變化與本身無關(guān)
- 具體產(chǎn)品與客戶端剝離,責(zé)任分割
二. 案例
- calculator: 使用簡單工廠模式, 創(chuàng)建控制臺(tái)計(jì)算器

簡單工廠實(shí)現(xiàn)計(jì)算器UML類圖
- 創(chuàng)建Calculator抽象類, 添加計(jì)算抽象方法, 添加數(shù)值屬性, get set方法
/**
* 計(jì)算器計(jì)算基類
*/
public abstract class OperationAbstract {
private BigDecimal number1;
private BigDecimal number2;
/**
* 由子類實(shí)現(xiàn)運(yùn)算規(guī)則
* @return
*/
public abstract BigDecimal calculate();
}
- 創(chuàng)建加減乘除實(shí)現(xiàn)類
/**
* 加法運(yùn)算
*/
public class Add extends OperationAbstract{
@Override
public BigDecimal calculate() {
return this.getNumber1().add(this.getNumber2());
}
}
/**
* 減法運(yùn)算
*/
public class Subtract extends OperationAbstract {
@Override
public BigDecimal calculate() {
return this.getNumber1().subtract(this.getNumber2());
}
}
/**
* 乘法運(yùn)算
*/
public class Multiply extends OperationAbstract {
@Override
public BigDecimal calculate() {
return this.getNumber1().multiply(this.getNumber2());
}
}
/**
* 除法運(yùn)算
*/
public class Divide extends OperationAbstract {
@Override
public BigDecimal calculate() {
return this.getNumber1().divide(this.getNumber2());
}
}
- 創(chuàng)建工廠類
/**
* 計(jì)算機(jī)靜態(tài)工廠類
*/
public final class OperationFactory {
/**
* 獲取計(jì)算
* @param symbol
* @return
*/
public static OperationAbstract createOperation (String symbol) {
switch (symbol) {
case SymbolConstants.ADD:
return new Add();
case SymbolConstants.SUBTRACT:
return new Subtract();
case SymbolConstants.MULTIPLY:
return new Multiply();
case SymbolConstants.DIVIDE:
return new Divide();
default:
throw new RuntimeException("暫不支持");
}
}
private OperationFactory () {}
}
- 測試
public static void main(String[] args) {
do {
//控制臺(tái)輸入
Scanner scanner = new Scanner(System.in);
//輸入3次
BigDecimal number1 = scanner.nextBigDecimal();
String symbol = scanner.next();
BigDecimal number2 = scanner.nextBigDecimal();
//通過靜態(tài)工廠獲取實(shí)例
OperationAbstract operation = OperationFactory.createOperation(symbol);
//放入計(jì)算數(shù)據(jù)
operation.setNumber1(number1);
operation.setNumber2(number2);
//獲取返回
BigDecimal result = operation.calculate();
System.out.println(result);
} while (true);
}
三. 實(shí)例下載
GitHub: 簡單工廠模式