Java中的工厂设计模式

时间:2020-02-23 14:36:13  来源:igfitidea点击:

欢迎使用Java教程中的Factory Design Pattern。
工厂模式是一种创新设计模式,它在JDK以及诸如Spring和Struts之类的框架中广泛使用。

工厂设计模式

当我们有一个具有多个子类的超类并且基于输入时,需要返回其中一个子类时,将使用工厂设计模式。
这种模式消除了从客户端程序到工厂类的类实例化的责任。

让我们首先学习如何在Java中实现工厂设计模式,然后再探讨工厂模式的优势。
我们将在JDK中看到一些工厂设计模式的用法。
请注意,此模式也称为工厂方法设计模式。

工厂设计模式超级类

工厂设计模式中的超级类可以是接口,抽象类或者普通的Java类。
对于我们的工厂设计模式示例,我们具有带有重写的toString()方法的抽象超类以进行测试。

package com.theitroad.design.model;

public abstract class Computer {
	
	public abstract String get内存();
	public abstract String getHDD();
	public abstract String getCPU();
	
	@Override
	public String toString(){
		return "内存= "+this.get内存()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
	}
}

工厂设计模式子类

假设我们有以下两种实现的PC和Server子类。

package com.theitroad.design.model;

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;
	}
	@Override
	public String get内存() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}

}

注意,这两个类都是"计算机"超级类的扩展。

package com.theitroad.design.model;

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;
	}
	@Override
	public String get内存() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}

}

工厂级

现在我们已经准备好超级类和子类,我们可以编写工厂类了。
这是基本的实现。

package com.theitroad.design.factory;

import com.theitroad.design.model.Computer;
import com.theitroad.design.model.PC;
import com.theitroad.design.model.Server;

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是工厂方法。

这是一个使用上述工厂设计模式实现的简单测试客户端程序。

package com.theitroad.design.test;

import com.theitroad.design.factory.ComputerFactory;
import com.theitroad.design.model.Computer;

public class TestFactory {

	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::内存= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::内存= 16 GB, HDD=1 TB, CPU=2.9 GHz

工厂设计模式的优势

  • 工厂设计模式提供了接口代码而不是实现代码的方法。

  • 工厂模式从客户端代码中删除了实际实现类的实例。
    工厂模式使我们的代码更健壮,更少耦合且易于扩展。
    例如,我们可以很容易地更改PC类的实现,因为客户端程序没有意识到这一点。

  • 工厂模式通过继承在实现和客户端类之间提供抽象。

JDK中的工厂设计模式示例

  • java.util.Calendar,ResourceBundle和NumberFormatgetInstance()方法使用Factory模式。

  • 包装类(例如Boolean,Integer等)中的" valueOf()"方法。