简单工厂和工厂方法模式在Java中的实现

一、简单工厂模式

1. 概述

简单工厂模式是一种创建型设计模式,它提供了一个统一的接口来创建不同类型的对象。根据不同的参数,工厂类能够返回不同类的实例。这种模式在不暴露对象实例化逻辑的同时,将其封装在一个工厂类中。

2. 实现步骤

下面是简单工厂模式的实现步骤:

步骤 描述
1 定义一个抽象产品类,该类将被不同类型的具体产品类继承。
2 定义具体产品类,它们继承了抽象产品类,并实现了相应的功能。
3 定义一个工厂类,它包含一个创建产品的方法,根据参数的不同返回不同的具体产品实例。

3. 代码示例

首先,我们定义一个抽象产品类Product

public abstract class Product {
    public abstract void operation();
}

然后,我们定义两个具体产品类ConcreteProductAConcreteProductB,它们继承了Product类并实现了operation方法:

public class ConcreteProductA extends Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

public class ConcreteProductB extends Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}

接下来,我们定义一个工厂类SimpleFactory,它包含一个创建产品的方法createProduct,根据传入的参数不同返回不同的具体产品实例:

public class SimpleFactory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        } else {
            throw new IllegalArgumentException("Invalid product type.");
        }
    }
}

最后,我们可以在客户端代码中使用简单工厂模式创建具体产品的实例:

public class Client {
    public static void main(String[] args) {
        Product productA = SimpleFactory.createProduct("A");
        productA.operation();
        
        Product productB = SimpleFactory.createProduct("B");
        productB.operation();
    }
}

以上代码的输出结果为:

ConcreteProductA operation
ConcreteProductB operation

二、工厂方法模式

1. 概述

工厂方法模式是一种创建型设计模式,它将对象的创建委托给子类来完成。工厂方法模式定义了一个用于创建对象的接口,子类可以决定实例化哪一个类。这种模式能够将对象的创建和使用分离,降低了耦合性。

2. 实现步骤

下面是工厂方法模式的实现步骤:

步骤 描述
1 定义一个抽象产品类,该类将被不同类型的具体产品类继承。
2 定义一个抽象工厂类,该类包含一个创建产品的抽象方法。
3 定义具体产品类,它们继承了抽象产品类,并实现了相应的功能。
4 定义具体工厂类,它继承了抽象工厂类,并实现了创建产品的抽象方法,根据需要返回相应的具体产品实例。

3. 代码示例

首先,我们定义一个抽象产品类Product

public abstract class Product {
    public abstract void operation();
}

然后,我们定义两个具体产品类ConcreteProductAConcreteProductB,它们继承了Product类并实现了operation方法:

public class ConcreteProductA extends Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

public class ConcreteProductB extends Product {
    @Override