Java のファクトリーパターンを実装する方法
Java において、ファクトリパターンは 2 つの手法で実装できます。単純ファクトリパターンと抽象ファクトリパターンです。
ファクトリーメソッドパターン:ファクトリーメソッドパターンの核心は、他のクラスのインスタンスを作成するファクトリクラスの定義です。具体的には以下の手順で行います。
- 抽象プロダクトクラスを作成し、製品の共通の属性とメソッドを定義します。
- 抽象クラスを継承して具体的な製品クラスを作成し、メソッドを実装する。
- パラメータを受け取ってファクトリが特定の製品クラスのインスタンスを作成できるようにするファクトリ クラスの作成
- ファクトリクラスにおいて製品インスタンスを作成するための静的メソッドを定義する。
- クライアント側では、ファクトリークラスの静的メソッドを呼び出すことで、製品インスタンスを取得します。
以下の例をご覧ください。
// 抽象产品类
public abstract class Product {
public abstract void use();
}
// 具体产品类A
public class ConcreteProductA extends Product {
@Override
public void use() {
System.out.println("使用具体产品A");
}
}
// 具体产品类B
public class ConcreteProductB extends Product {
@Override
public void use() {
System.out.println("使用具体产品B");
}
}
// 工厂类
public class Factory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
return null;
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Product productA = Factory.createProduct("A");
productA.use(); // 使用具体产品A
Product productB = Factory.createProduct("B");
productB.use(); // 使用具体产品B
}
}
抽象ファクトリーパターン:抽象ファクトリーパターンとは、具体製品の生成を具象ファクトリーに移譲するオブジェクト生成パタンの一種です。ファクトリーインタフェースと製品インタフェースを定義することで実現します。具体的には以下のステップで行います。
- 抽象的な製品インターフェイスを作成し、製品の共通プロパティとメソッドを定義する。
- 抽象的な製品インターフェースを実装する具象的な製品クラスを作成する。
- 抽象ファクトリーインタフェースを作成し、具体プロダクトクラスに基づいてプロダクトを作成する方法を定義します。
- 具象的な実装クラスを作成し、抽象ファクトリーインターフェースを実装し、具体的な生成メソッドを実装する。
- クライアント側では、具体生成クラスを利用して具体的な製品インスタンスを生成します。
以下にサンプルコードを示します。
// 抽象产品接口
public interface Product {
void use();
}
// 具体产品类A
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("使用具体产品A");
}
}
// 具体产品类B
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("使用具体产品B");
}
}
// 抽象工厂接口
public interface Factory {
Product createProduct();
}
// 具体工厂类A
public class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂类B
public class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use(); // 使用具体产品A
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use(); // 使用具体产品B
}
}
この方法では、ファクトリーパターンによってオブジェクトの作成と使用を分離し、クライアントは具体的な製品の作成の詳細を気にする必要がなく、ファクトリークラスを使用して製品のインスタンスを取得できます。