Factory Design Pattern
当我们有一个具有多个子类的超类时,我们使用工厂设计模式,并且根据输入类型,我们需要返回其中一个子类。此模式就是将类实例化的职责从客户端程序转移到工厂类。
让我们首先学习如何在java中实现工厂设计模式,然后再研究工厂模式的优点。我们将在JDK中看到一些工厂设计模式的使用。请注意,此模式也称为工厂方法设计模式。
Factory Design Pattern Super Class
工厂设计模式中的超类可以是接口、抽象类或普通java类。对于我们的工厂设计模式示例,我们有一个带有覆盖的toString()方法的抽象超类,用于测试。
<code>public abstract class Computer {
\tpublic abstract String getRAM();
\tpublic abstract String getHDD();
\tpublic abstract String getCPU();
\t@Override
\tpublic String toString() {
\t\treturn "RAM= " + this.getRAM() + ", HDD=" + this.getHDD() + ", CPU=" + this.getCPU();
\t}
}/<code>
Factory Design Pattern Sub Classes
假设我们有两个子类PC和server。
<code>public class PC extends Computer {
\tprivate String ram;
\tprivate String hdd;
\tprivate String cpu;
\t
\tpublic PC(String ram, String hdd, String cpu){
\t\tthis.ram=ram;
\t\tthis.hdd=hdd;
\t\tthis.cpu=cpu;
\t}
\t@Override
\tpublic String getRAM() {
\t\treturn this.ram;
\t}
\t@Override
\tpublic String getHDD() {
\t\treturn this.hdd;
\t}
\t@Override
\tpublic String getCPU() {
\t\treturn this.cpu;
\t}
}
public class Server extends Computer {
\tprivate String ram;
\tprivate String hdd;
\tprivate String cpu;
\t
\tpublic Server(String ram, String hdd, String cpu){
\t\tthis.ram=ram;
\t\tthis.hdd=hdd;
\t\tthis.cpu=cpu;
\t}
\t@Override
\tpublic String getRAM() {
\t\treturn this.ram;
\t}
\t@Override
\tpublic String getHDD() {
\t\treturn this.hdd;
\t}
\t@Override
\tpublic String getCPU() {
\t\treturn this.cpu;
\t}
}/<code>
注意,这两个类都扩展了Computer超类。
Factory Class
现在我们已经准备好了超类和子类,我们可以编写工厂类了。下面是基本的实现。
<code>public class ComputerFactory {
\tpublic static Computer getComputer(String type, String ram, String hdd, String cpu){
\t\tif("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
\t\telse if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
\t\t
\t\treturn null;
\t}
}/<code>
工厂设计模式方法的一些要点:
1、工厂类可以是单例的,返回子类的方法可以是静态的。
2、根据输入的参数返回不同的子类对象。
下面我们写一些测试代码。
<code>public class TestFactory {
\tpublic static void main(String[] args) {
\t\tComputer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
\t\tComputer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
\t\tSystem.out.println("Factory PC Config::"+pc);
\t\tSystem.out.println("Factory Server Config::"+server);
\t}
}/<code>
调试输出内容如下。
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
工厂模式的优点:
1、工厂设计模式提供了接口代码而不是实现代码的方法。
2、工厂模式从客户端代码中移除实际实现类的实例化。工厂模式使我们的代码更健壮、耦合更少且易于扩展。例如,我们可以很容易地改变PC类的实现,因为客户端程序不知道这一点。
3、工厂模式通过继承在实例实现和客户类之间提供抽象。
工厂模式在jdk中的应用
1、java.util.Calendar、ResourceBundle和NumberFormat的getInstance()方法使用工厂模式。
2、valueOf()方法在包装类,如布尔,整数类型等。
閱讀更多 東方洛雷 的文章