在面向对象编程中,工厂方法和工厂模式是两个重要的概念,它们都属于创建型模式,用于解决对象创建的问题。在本文中,我们将从多个角度来分析工厂方法和工厂模式的区别和联系。
一、定义
1. 工厂方法
工厂方法又称为虚拟构造器(Virtual Constructor)模式,它定义了一个用于创建对象的接口,但是由子类决定该创建哪个类的实例。也就是说,工厂方法模式让类的实例化延迟到子类中进行。
2. 工厂模式
工厂模式又称为简单工厂模式,它是由一个工厂对象决定创建出哪一种产品类的实例。工厂模式是通过向客户端提供一个统一的接口来隐藏实例化对象的细节,实现了对象的解耦。
二、角色
1. 工厂方法的角色
- 抽象产品角色:定义了产品的规范,描述了产品的主要特性和功能;
- 具体产品角色:实现了抽象产品角色,由工厂类调用,可以被外界使用;
- 抽象工厂角色:提供了创建产品的接口,包含多个抽象产品的创建方法;
- 具体工厂角色:实现了抽象工厂接口,返回一个具体产品实例。
2. 工厂模式的角色
- 抽象产品角色:定义了产品的规范,描述了产品的主要特性和功能;
- 具体产品角色:实现了抽象产品角色,由工厂类调用,可以被外界使用;
- 工厂角色:工厂角色负责实现创建所有实例的内部逻辑,在客户端的请求下创建产品类的实例。
三、适用场景
1. 工厂方法的适用场景
① 当一个类无法预料需要创建哪一个类的时候;
② 当一个类需要创建多个对象时,但是这些对象又有一定的关联性或者约束条件时;
③ 当一个类需要将对象的创建分离出来,委托给子类完成时。
2. 工厂模式的适用场景
① 当一个类需要根据不同的参数创建不同的对象时;
② 当一个类需要简化对象的创建过程时;
③ 当一个类需要将其内部创建对象的过程对外部隐藏时。
四、代码举例
1. 工厂方法的示例代码
```
// 抽象产品类
interface Product {
public void show();
}
// 具体产品类1
class ConcreteProduct1 implements Product {
public void show() {
System.out.println("具体产品1显示...");
}
}
// 具体产品类2
class ConcreteProduct2 implements Product {
public void show() {
System.out.println("具体产品2显示...");
}
}
// 抽象工厂类
interface Factory {
public Product createProduct();
}
// 具体工厂类1
class ConcreteFactory1 implements Factory {
public Product createProduct() {
return new ConcreteProduct1();
}
}
// 具体工厂类2
class ConcreteFactory2 implements Factory {
public Product createProduct() {
return new ConcreteProduct2();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Factory factory1 = new ConcreteFactory1();
Product product1 = factory1.createProduct();
product1.show();
Factory factory2 = new ConcreteFactory2();
Product product2 = factory2.createProduct();
product2.show();
}
}
```
2. 工厂模式的示例代码
```
// 抽象产品类
interface Product {
public void show();
}
// 具体产品类1
class ConcreteProduct1 implements Product {
public void show() {
System.out.println("具体产品1显示...");
}
}
// 具体产品类2
class ConcreteProduct2 implements Product {
public void show() {
System.out.println("具体产品2显示...");
}
}
// 工厂类
class SimpleFactory {
public static Product createProduct(String type) {
Product product = null;
switch (type) {
case "product1":
product = new ConcreteProduct1();
break;
case "product2":
product = new ConcreteProduct2();
break;
}
return product;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
Product product1 = SimpleFactory.createProduct("product1");
product1.show();
Product product2 = SimpleFactory.createProduct("product2");
product2.show();
}
}
```
五、总结
工厂方法和工厂模式都是创建型模式,它们的主要区别在于:工厂方法模式使用子类来处理对象的创建,而工厂模式则是使用一个工厂类来处理对象的创建。在使用上,我们需要根据实际情况来选择使用哪一种模式才更为合适。
扫码咨询 领取资料