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

設計模式之工廠方法模式(java)

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、總結

工廠方法模式定義一個建立產品物件工廠介面,將建立的工作推遲到子類。相比於簡單工廠模式,簡單工廠的工廠類負責具體產品物件的建立,而具體產品的新增和刪除都需要修改工廠類,不符合"開-閉"原則;而工廠方法模式,定義了一個抽象工廠介面,它不負責具體產品物件的建立,只負責定義一些規範,具體的建立過程由其子類完成,所以,通常一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品。

工廠方法模式是對簡單工廠模式的抽象。