概念
ファクトリーパターン(ファクトリーパターン)は、Javaで最も一般的に使用されるデザインパターンの1つです。このタイプのデザインパターンは作成パターンであり、オブジェクトを作成するための最良の方法を提供します。
ファクトリモードでは、オブジェクトの作成時に作成ロジックをクライアントに公開せず、共通のインターフェイスを使用して、新しく作成されたオブジェクトをポイントします。
シンプルなファクトリーパターン
Simple Factory Patternは、ファクトリオブジェクトが作成される製品を決定するインスタンスクラスを参照しますが、GOF23デザインパターンには属していません。
1.インターフェイスを作成します
public interface ICourse {
public void record();
}
2.インターフェイス実装クラスを作成します
public class JavaCourse implements ICourse{
@Override
public void record() {
System.out.println("Java 语言");
}
}
public class PythonCourse implements ICourse {
@Override
public void record() {
System.out.println("pythod语言");
}
}
3.ファクトリクラスを作成します
public class SimpleFactory {
public ICourse getCourse(String name){
if("java".equals(name)){
return new JavaCourse();
}
if("python".equals(name)){
return new PythonCourse();
}else{
return null;
}
}
}
4.テストクラスを作成します
public class FactoryTest {
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
ICourse course = simpleFactory.getCourse("java");
course.record();
}
}
運用結果:
シンプルファクトリは、ファクトリクラスが作成するオブジェクトの数が少なく、クライアントがファクトリクラスのパラメータを渡すだけで、オブジェクトの作成方法のロジックを気にする必要がないシナリオに適しています。
不利益
- 工場の責任は比較的重く、過度に複雑な製品構造を拡張することは容易ではありません。
ファクトリーメソッドパターン
ファクトリメソッドパターン(ファクトリメソッドパターン)は、オブジェクトを作成するためのインターフェイスの定義を指しますが、このインターフェイスを実装するクラスにインスタンス化するクラスを決定させ、ファクトリメソッドはクラスのサブクラスへのインスタンス化を遅らせます。
1.ファクトリインターフェイスを作成します
public interface ICourseFactory {
public ICourse create();
}
2.インターフェイスを実装するファクトリクラスを作成します
public class JavaCourseFactory implements ICourseFactory{
@Override
public ICourse create() {
return new JavaCourse();
}
}
public class PythonCourseFactory implements ICourseFactory{
@Override
public ICourse create() {
return new PythonCourse();
}
}
3.テストクラス
public class FactoryMethodTest {
public static void main(String[] args) {
ICourseFactory iCourseFactory=new JavaCourseFactory();
ICourse icourse=iCourseFactory.create();
icourse.record();
}
}
操作結果:
ファクトリメソッドモードでは、ユーザーは必要な製品に対応するファクトリのみを気にする必要があり、作成の詳細は気にする必要はありません。
不利益
- クラスの数が多すぎて複雑さが増すのは簡単です
- システムの抽象化と理解の難しさが増した
抽象的な工場パターン
抽象ファクトリーパターンは、スーパーファクトリーの周りに他のファクトリーを作成することです。このスーパーファクトリーは、他の工場のファクトリーとも呼ばれます。このタイプのデザインパターンは作成パターンであり、オブジェクトを作成するための最良の方法を提供します。
抽象ファクトリパターンでは、インターフェイスが関連オブジェクトのファクトリを作成する役割を果たし、それらのクラスを明示的に指定する必要はありません。生成された各ファクトリは、ファクトリパターンに従ってオブジェクトを提供できます。
1.製品インターフェースを作成します
public interface IAirConditioning {
public void cold();
}
public interface IPhone {
public void call();
}
2.製品を作成します
public class GreePhone implements IPhone {
@Override
public void call() {
System.out.println("格力电话");
}
}
public class GreeAirConditioning implements IAirConditioning {
@Override
public void cold() {
System.out.println("好空调,格力造");
}
}
public class MideaPhone implements IPhone{
@Override
public void call() {
System.out.println("美的电话");
}
}
public class MideaAirConditioning implements IAirConditioning {
@Override
public void cold() {
System.out.println("美的空调-精彩生活由我创造");
}
}
3.抽象的なファクトリを作成します
public abstract class AbstractFactory {
public void init(){
System.out.println("开始。。。");
}
protected abstract IPhone createPhone();
protected abstract IAirConditioning createAirConditioning();
}
4.特定のファクトリを作成します
public class MideaFactory extends AbstractFactory{
@Override
protected IPhone createPhone() {
return new MideaPhone();
}
@Override
protected IAirConditioning createAirConditioning() {
return new MideaAirConditioning();
}
}
public class GreeFactory extends AbstractFactory {
@Override
protected IPhone createPhone() {
return new GreePhone();
}
@Override
protected IAirConditioning createAirConditioning() {
return new GreeAirConditioning();
}
}
4.テスト
public class AbstractFactoryTest {
public static void main(String[] args) {
GreeFactory greeFactory=new GreeFactory();
greeFactory.createAirConditioning().cold();
}
}
動作結果:
不利益
- 作成される可能性のあるすべての製品セットを指定します。製品ファミリが変更されると、抽象ファクトリから特定のファクトリに調整が行われ、開閉の原則に準拠しません。
- システムの抽象化と理解の難しさが増した
開閉の原則:クラス、モジュール、関数などのソフトウェアエンティティは、拡張のために開いて、変更のために閉じる必要があります。