1. 概述
簡單工廠模式又叫做靜態工廠方法(Static Factory Method)模式,不屬於23種GOF設計模式之一。
簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解爲是不同工廠模式的一個特殊實現。
2. 示例程序
簡單工廠模式要有一個工廠類,這裏其名爲Factory。
一個產品接口類,IProduct類。
一些實際產品,Product類,Product類需要實現產品接口類(IProduct),Product類可以有多個,例如Product01,Product02,Product03。
工廠可以通過傳入的參數生成具體的產品,UML圖如下所示:
工廠類,Factory.java:
package simpleFactory.example;
public class Factory {
public static IProduct getIProductInstance(String className) {
IProduct result = null;
if(className.equals("product01")) {
result = new Product01();
} else if(className.equals("product02")){
result = new Product02();
} else if(className.equals("product03")){
result = new Product03();
}
return result;
}
}
產品接口類,IProduct.java:
package simpleFactory.example;
public interface IProduct {
public void use();
}
具體產品類,Product01.java:
package simpleFactory.example;
public class Product01 implements IProduct {
@Override
public void use() {
System.out.println("use product01");
}
}
具體產品類,Product02.java:
package simpleFactory.example;
public class Product02 implements IProduct {
@Override
public void use() {
System.out.println("use product02");
}
}
具體產品類,Product03.java:
package simpleFactory.example;
public class Product03 implements IProduct {
@Override
public void use() {
System.out.println("use product03");
}
}
測試類,main.java:
package simpleFactory.example;
public class main {
public static void main(String args[]) {
IProduct iProduct = Factory.getIProductInstance("product03");
iProduct.use();
iProduct = Factory.getIProductInstance("product02");
iProduct.use();
iProduct = Factory.getIProductInstance("product01");
iProduct.use();
}
}
運行截圖:
3. 具體產品很多
上述的示例有一個問題,如果具體物品很多的話,工廠類中中的分支語句(if,else)寫不完了。
if(className.equals("product01")) {
result = new Product01();
} else if(className.equals("product02")){
result = new Product02();
} else if(className.equals("product03")){
result = new Product03();
}
...
使用反射可以解決上述問題,修改工廠類,通過類的絕對路徑名獲得其class,再獲得他的實例。Factory01.java:
package simpleFactory.example1;
import simpleFactory.example.IProduct;
public class Factory01 {
public static IProduct getIProductInstance(String className) {
IProduct result = null;
try {
result = (IProduct) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
測試類,main.java,simpleFactory.example.Product01爲類的路徑:
package simpleFactory.example1;
import simpleFactory.example.IProduct;
public class main {
public static void main(String args[]) {
IProduct iProduct = Factory01.getIProductInstance("simpleFactory.example.Product01");
iProduct.use();
iProduct = Factory01.getIProductInstance("simpleFactory.example.Product02");
iProduct.use();
iProduct = Factory01.getIProductInstance("simpleFactory.example.Product03");
iProduct.use();
}
}
運行截圖如下所示:
4. 多類產品
假如有多類產品,例如添加了用戶類。
可以使用泛型來解決這個問題,不固定的去使用IProduct。
工廠類,Factory03.java,如下所示:
package simpleFactory.example2;
public class Factory03 {
public static <T> T getIProductInstance(String className) {
T result = null;
try {
result = (T) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
測試類,main.java:
package simpleFactory.example2;
public class main {
public static void main(String args[]) {
IProduct iProduct = Factory03.getIProductInstance("simpleFactory.example2.Product01");
iProduct.use();
iProduct = Factory03.getIProductInstance("simpleFactory.example2.Product02");
iProduct.use();
iProduct = Factory03.getIProductInstance("simpleFactory.example2.Product03");
iProduct.use();
IUser iUser = Factory03.getIProductInstance("simpleFactory.example2.User03");
iUser.use();
iUser = Factory03.getIProductInstance("simpleFactory.example2.User02");
iUser.use();
iUser = Factory03.getIProductInstance("simpleFactory.example2.User01");
iUser.use();
}
}
運行截圖: