设计模式-工厂模式


设计模式-工厂模式


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()方法在包装类,如布尔,整数类型等。


分享到:


相關文章: