設計模式之工廠方法模式(java)
阿新 • • 發佈:2018-12-18
1、概念
工廠方法模式(FACTORY METHOD)是一種常用的物件建立型設計模式,此模式的核心精神是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、複用和方便後期維護拓展的目的。它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;具體產品。
2、UML類圖
3、java程式碼實現
抽象產品:通常是一個介面。例如:定義一個運算操作介面(Operate)
public interface Operate {
double getResult(double numA, double numB) throws Exception;
}
具體產品:實現抽象產品介面。例如:定義加(Add)、減(Sub)、乘(Mul)、除(Div)四種具體運算類
public class Add implements Operate { @Override public double getResult(double numA, double numB) { // 這裡使用BigDecimal是為了處理double型別資料直接相加丟失精度的問題 BigDecimal decimalA = new BigDecimal(Double.toString(numA)); BigDecimal decimalB = new BigDecimal(Double.toString(numB)); BigDecimal result = decimalA.add(decimalB); return result.doubleValue(); } }
public class Sub implements Operate {
@Override
public double getResult(double numA, double numB) {
return numA - numB;
}
}
public class Mul implements Operate {
@Override
public double getResult(double numA, double numB) {
return numA * numB;
}
}
public class Div implements Operate { @Override public double getResult(double numA, double numB) throws Exception { if (numB == 0) { throw new Exception("除數不能為0"); } return numA / numB; } }
抽象工廠:通常是一個介面。例如:定義一個運算操作介面(OperateFactory)
public interface OperateFactory {
Operate createOperate();
}
具體工廠:實現抽象工廠介面。例如:定義加法運算工廠(AddFactory)、減法運算工廠(SubFactory)、乘法運算工廠(MulFactory)、除法運算(DivFactory)四種具體運算工廠類
public class AddFactory implements OperateFactory {
@Override
public Operate createOperate() {
System.out.println("加法運算");
return new Add();
}
}
public class SubFactory implements OperateFactory {
@Override
public Operate createOperate() {
System.out.println("減法運算");
return new Sub();
}
}
public class MulFactory implements OperateFactory {
@Override
public Operate createOperate() {
System.out.println("乘法運算");
return new Mul();
}
}
public class DivFactory implements OperateFactory {
@Override
public Operate createOperate() {
System.out.println("除法運算");
return new Div();
}
}
測試
@Test
public void test() throws Exception {
double numA = 2.4D, numB = 1.2D;
OperateFactory factory = new AddFactory();
Operate operate = factory.createOperate();
System.out.println(operate.getResult(numA, numB));
factory = new SubFactory();
operate = factory.createOperate();
System.out.println(operate.getResult(numA, numB));
factory = new MulFactory();
operate = factory.createOperate();
System.out.println(operate.getResult(numA, numB));
factory = new DivFactory();
operate = factory.createOperate();
System.out.println(operate.getResult(numA, numB));
}
測試結果
加法運算
3.6
減法運算
1.2
乘法運算
2.88
除法運算
2.0
4、總結
工廠方法模式定義一個建立產品物件的工廠介面,將建立的工作推遲到子類。相比於簡單工廠模式,簡單工廠的工廠類負責具體產品物件的建立,而具體產品的新增和刪除都需要修改工廠類,不符合"開-閉"原則;而工廠方法模式,定義了一個抽象工廠介面,它不負責具體產品物件的建立,只負責定義一些規範,具體的建立過程由其子類完成,所以,通常一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品。
工廠方法模式是對簡單工廠模式的抽象。