Factory Design Pattern
工厂模式是创建型模式之一,它被广泛应用于 JDK 以及 Spring等框架中,工厂模式将类的实例化责任从客户端转移到一个单独的工厂类中,其实,简而言之一句话,该模式主要解决的问题是:当我们有一个包含多个子类的父类,而在实际使用的时候,需要根据输入的实际条件,返回其中一个子类时,就会使用工厂设计模式。
Factory Design Pattern Super Class
工厂设计模式中的父类可以是接口、抽象类或普通的java类,定义Computer抽象类,如下:
public abstract class Computer {
public abstract String getRAM();
public abstract String getHDD();
public abstract String getCPU();
@Override
public String toString() {
return "RAM= " + this.getRAM() + ", HDD=" + this.getHDD() + ", CPU=" + this.getCPU();
}
}
Factory Design Pattern Sub Classes
定义两个子类,分别是PC和Server,如下:
public class PC extends Computer {
private String ram;
private String hdd;
private String cpu;
public PC(String ram, String hdd, String cpu) {
this.ram = ram;
this.hdd = hdd;
this.cpu = cpu;
}
public String getRAM() {
return this.ram;
}
public String getHDD() {
return this.hdd;
}
public String getCPU() {
return this.cpu;
}
}
Server:
public class Server extends Computer{
private String ram;
private String hdd;
private String cpu;
public Server(String ram, String hdd, String cpu) {
this.ram = ram;
this.hdd = hdd;
this.cpu = cpu;
}
public String getRAM() {
return this.ram;
}
public String getHDD() {
return this.hdd;
}
public String getCPU() {
return this.cpu;
}
}
Factory Class
现在已经准备好了父类和子类,可以编写工厂类了,如下:
public class ComputerFactory {
public static Computer getComputer(String type, String ram, String hdd, String cpu) {
if ("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
else if ("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
return null;
}
}
工厂设计模式方法的一些要点是:
- 可以设置
Factory类为Singleton,也可以将返回子类的方法保持为静态。 - 基于输入参数,将创建并返回不同的子类。getComputer是工厂方法。
下面是一个简单的测试客户端程序,它使用上面的工厂设计模式实现。
public class App {
public static void main(String[] args) {
Computer pc = ComputerFactory.getComputer("pc", "2 GB", "500 GB", "2.4 GHz");
Computer server = ComputerFactory.getComputer("server", "16 GB", "1 TB", "2.9 GHz");
System.out.println("Factory PC Config::" + pc);
System.out.println("Factory Server Config::" + server);
}
}
输出:
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
Factory Design Pattern Examples in JDK
JDK中的java.util.Calendar,ResourceBundle和NumberFormat中的getInstance(),以及Boolean, Integer中的valueOf等等 使用的都是工厂模式。