1.単純なファクトリパターン(静的ファクトリーモード)
伝統的なデザインパターン:
利点 | 、理解することは簡単な操作しやすいです |
---|---|
短所 | 拡張のためのオープン、の原則の変更のため閉鎖することをOCP原理のデザインパターンに違反して |
シンプルなファクトリパターン:
- スキーマを作成するために属し、単純なファクトリパターンは、製品のクラスのインスタンスを作成するファクトリオブジェクトによって決定されます。シンプルなファクトリパターン工場モデルファミリは、最もシンプルで実用的なモードです
- 定義作成されたオブジェクト・クラス、挙動をカプセル化するオブジェクト・クラスのインスタンス(コード)
2.ファクトリメソッドパターン
ファクトリメソッドパターン:オブジェクトの抽象的定義を作成する方法は、サブクラスによってインスタンス化されるように決定されます。工場モードのメソッドは、オブジェクトのサブクラスをインスタンス化するために延期されます
3. Abstract Factoryパターン
1、Abstract Factoryパターン:特定のクラスを指定しなくても、依存性関連またはオブジェクトのクラスタを作成するために使用されるインターフェイスを定義します
2、抽象的な工場モデルをすることができ、簡単な工場モードとファクトリメソッドパターンの統合
図3は、設計の観点から、Abstract Factoryパターンは、単純なファクトリパターン(より抽象的な)を改善することです
図4に示すように、二つの層に抽象工場、== AbsFactory ==(抽象工場)及び植物特定の実装サブクラス。これは、子オブジェクトの種類を作成するために、対応するクラスファクトリに従って使用することができます。クラスタへのこのような単一の単純なファクトリクラス== ==コードの維持・拡大に、より助長工場
4、工場モードモード
JDKの例では:
Calendar calendar = Calendar.getInstance();
//二级
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}
//三级
private static Calendar createCalendar(TimeZone zone,
Locale aLocale)
{
CalendarProvider provider =
LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
.getCalendarProvider();
if (provider != null) {
try {
return provider.getInstance(zone, aLocale);
} catch (IllegalArgumentException iae) {
// fall back to the default instantiation
}
}
Calendar cal = null;
if (aLocale.hasExtensions()) {
String caltype = aLocale.getUnicodeLocaleType("ca");
//根据不同的值,返回不同的实例
if (caltype != null) {
switch (caltype) {
case "buddhist":
cal = new BuddhistCalendar(zone, aLocale);
break;
case "japanese":
cal = new JapaneseImperialCalendar(zone, aLocale);
break;
case "gregory":
cal = new GregorianCalendar(zone, aLocale);
break;
}
}
}
if (cal == null) {
// If no known calendar type is explicitly specified,
// perform the traditional way to create a Calendar:
// create a BuddhistCalendar for th_TH locale,
// a JapaneseImperialCalendar for ja_JP_JP locale, or
// a GregorianCalendar for any other locales.
// NOTE: The language, country and variant strings are interned.
if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
cal = new BuddhistCalendar(zone, aLocale);
} else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
&& aLocale.getCountry() == "JP") {
cal = new JapaneseImperialCalendar(zone, aLocale);
} else {
cal = new GregorianCalendar(zone, aLocale);
}
}
return cal;
}
要約:
- 意味:コードは、クラス一元管理とメンテナンスに配置された抽出されたオブジェクトを、インスタンス化し、メインプロジェクトの依存関係を切り離す達成。これにより、プロジェクトの拡張や保守性を高めることができます。
- デザインパターンの抽象的な原則への依存
- オブジェクトのインスタンスを作成し、新しい指示しますが、植物のクラスアクションでこの新しいメソッド、および戻りません。
- (インタフェース)クラスが具象クラスを継承してみましょう、しかし、継承や抽象インタフェースを実装していません。
- すでに基底クラスで実装される方法をカバーしないでください。