Javaのデザインパターン(3)簡単なファクトリパターン

定義と種類

  • 定義:これは製品のクラスのインスタンスを作成するファクトリオブジェクトによって決定さ
  • タイプ:タイプを作成しますが、GOF23設計パターン属していません

該当シーン

  • オブジェクトファクトリクラスの比較的小型の作成に責任があります
  • クライアント(アプリケーション層)はパラメータだけ渡さファクトリクラスを知って、オブジェクト(ロジック)を作成する方法を気にしません

利点

唯一の正しいパラメータを渡す必要がある、あなたは、作成の詳細を知らなくても、あなたが必要とするオブジェクトを取得することができます

短所

ファクトリクラスの機能相対太りすぎ、新製品、ファクトリクラスの決意ロジックを変更する必要があり、追加の開閉の原則に反して

コーディング

抽象クラスの製品を作成します。

public abstract class Video {
    public abstract void produce();
}

製品の実装クラス

public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java课程");
    }
}
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Python视频");
    }
}

製品の作成の詳細を知らなくても、製品の種類によって製品を作成するには、対応する製品の簡単な工場、アプリケーション側を作成します。

public class VideoFactory {

    public Video getVideo(String type) {
        if ("java".equalsIgnoreCase(type)) {
            return new JavaVideo();
        } else if ("python".equalsIgnoreCase(type)) {
            return new PythonVideo();
        } else {
            return null;
        }
    }
}

テストカテゴリ

public class Test {
    public static void main(String[] args) {
        VideoFactory videoFactory = new VideoFactory();
        Video video = videoFactory.getVideo("Java");
        video.produce();
    }
}

コンソール出力

录制Java课程

あなたが製品を増やす場合は、我々だけでなく、また、我々は開閉の原則に違反して、ファクトリクラスを変更する必要があり、製品に対応する製品カテゴリを変更する必要があります。

私たちは、リフレクションを通じて当社のファクトリクラスを最適化することができます

public class VideoFactory {

    public Video getVideo(Class<? extends Video> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

その結果、製品が我々はファクトリクラスを変更する必要はありませんが、製品に直接追加することができたときに追加されます。

最終UMLのクラス図

ソース決意

JDKソース

JDKでは、そのような工場モードのような単純な例はjava.util.Calendar、一連のgetInstanceオーバーロードされたメソッドを作成するために提供されるCalendar植物製品の簡単な方法を。

public static Calendar getInstance()
public static Calendar getInstance(TimeZone zone)
public static Calendar getInstance(Locale aLocale)
public static Calendar getInstance(TimeZone zone,Locale aLocale)

コア法

private static Calendar createCalendar(TimeZone zone,Locale aLocale)

ソースコードが長く、投稿はありませんが、次のソースに行くことができます興味を持っています。

Calendar次のようにUMLのクラス図

Logbackソース

logback単純なクラスファクトリパターンは、主に反映されch.qos.logback.classic.LoggerContext#getLogger(String)

@Override
public final Logger getLogger(final String name) {

    if (name == null) {
        throw new IllegalArgumentException("name argument cannot be null");
    }

    // 判断log类型返回root节点的logger
    if (Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(name)) {
        return root;
    }

    int i = 0;
    Logger logger = root;

    // 如果缓存中已经存在的指定的logger,直接返回childLogger
    Logger childLogger = (Logger) loggerCache.get(name);
    // if we have the child, then let us return it without wasting time
    if (childLogger != null) {
        return childLogger;
    }

    // 以下是创建logger的逻辑
    String childName;
    while (true) {
        int h = LoggerNameUtil.getSeparatorIndexOf(name, i);
        if (h == -1) {
            childName = name;
        } else {
            childName = name.substring(0, h);
        }
        // move i left of the last point
        i = h + 1;
        synchronized (logger) {
            childLogger = logger.getChildByName(childName);
            if (childLogger == null) {
                childLogger = logger.createChildByName(childName);
                loggerCache.put(childName, childLogger);
                incSize();
            }
        }
        logger = childLogger;
        if (h == -1) {
            return childLogger;
        }
    }
}

これは典型的な、単純なファクトリメソッドです

おすすめ

転載: www.cnblogs.com/gcdd/p/12292126.html