工場パターンの定義:オブジェクトを作成するためのインターフェイスを提供します。
工場モードを使用する理由
ファクトリーモデルは、私たちが使用する最も一般的なモデルです。
ファクトリーモデルが一般的に使用されるのはなぜですか?工場パターンは新しいインスタンスオブジェクトを作成するのと同等であるため、たとえばクラスクラスに基づいてインスタンスオブジェクトを生成する必要があります。もっと注意する必要があります。
サンプルのインスタンスオブジェクトを作成する場合は、サンプルクラスを使用してみましょう。
コードコピーは次のとおりです。
サンプルサンプル= new Sample();
ただし、現実には、割り当てクエリデータベースなど、サンプルインスタンスを作成するときに、通常、いくつかの初期化作業を行います。
まず第一に、私たちが考えているのは、サンプルのコンストラクターを使用できることです。そうすれば、インスタンスが生成され、次のように書かれています。
コードコピーは次のとおりです。
サンプルサンプル=新しいサンプル(パラメーター);
ただし、サンプルインスタンスを作成するときに実行される初期化が割り当てほど単純ではない場合、コードにも書き込まれる場合は、コードがugいになります(リファクタルの再編成が必要です)。
なぜコードはこの感覚を持っていないかもしれません方法は、バスケットでは非常に危険です。長いコードは各セグメントに派遣され、セグメントは再び「カプセル化」されます(セグメント間の結合接続を減らします)。各セグメントに影響を与えるものはもうありません。
この例では、最初に、インスタンスを作成する作業をインスタンスの使用作業から分離する必要があります。つまり、サンプルのコンストラクターからインスタンスを作成するために必要な大量の初期化作業を分離する必要があります。
現時点では、オブジェクトを生成するために工場の工場パターンが必要であり、単純な新しいサンプル(パラメーター)を使用できなくなりました。また、インターフェイス指向のプログラミングによると、サンプルにMySampleなどの継承がある場合は、サンプルをインターフェイスに抽象化する必要があります。現在、サンプルはインターフェイスになり、2つのサブクラスがmysampleとhissampleを備えています。次のように、それらをインスタンス化したい場合:
コードコピーは次のとおりです。
サンプルmysample = new mySample();
プロジェクトが深くなると、「多くの息子を育てる」ため、これらの息子を1つずつインスタンス化する必要があります従来のプログラムでは避けられません。
しかし、最初から工場モデルを意識的に使用すると、これらのトラブルはなくなります。
工場法
サンプルインスタンスの作成に特化した工場を構築します。
コードコピーは次のとおりです。
パブリッククラスの工場{
public static sample creator(int whis){
// getClassサンプルを生成する一般に、動的クラスの読み込みを使用してクラスをロードできます。
if(which == 1)
新しいsamplea()を返します。
else if(which == 2)
new samplebを返します();
}
}
次に、プログラムでサンプルをインスタンス化する場合は、次のようにコピーコードを使用します。
サンプルsamplea = factory.creator(1);
このようにして、サンプルの特定のサブクラスは、パッケージ効果を達成するために、この原則を比較することができます。間違いを犯すのが簡単です。特定の仕事をしたすべての人は、これを深く理解しています。プログラミングからの人生の原則も理解できるようですか?
工場の方法を使用して、最初に、上記のサンプルインターフェイスの実装クラスがあり、第二に、工場のクラスがあります。下の図に示すように、製品サンプルを生成するには、次のようになります。
より複雑にするために、それは工場のクラスを拡張することです。これは、その実装クラスのConcreteFactoryを継承します。
抽象工場
工場モデルには、工場の方法と抽象的な工場が含まれます。
これら2つのパターンの違いは、オブジェクトの作成の複雑さです。上記の工場法のように、オブジェクトを作成する方法が複雑になる場合、新しい製品インターフェイスサンプル2がある場合、オブジェクトサンプルを作成することです。
ここでの仮定:サンプルには2つの具体的なクラスがあり、Sample2には2つのコンクリートクラスがあります。Sample2aとSampleB2は、上記の例を抽象クラスに変え、抽象クラスの共通部分をカプセル化し、使用します。さまざまな部品サブクラスの実装では、上記の例の工場を抽象工場に拡張するための以下は次のとおりです。
コードコピーは次のとおりです。
パブリックアブストラクトクラスファクトリー{
パブリックアブストラクトサンプル作成者();
パブリックアブストラクトサンプル2 creator(string name);
}
Public Class SimpleFactoryは工場を拡張します{
public sample creator(){.........新しいsampleaを返す}
public sample2 creator(string name){.........新しいsample2a}を返す}
}
パブリッククラスの爆弾は工場を拡張します{
public sample creator(){...... return new sampleb}
public sample2 creator(string name){...... return new sample2b}
}
上記から、2つの工場はそれぞれサンプルとサンプル2を生成します。
抽象的な工場には、SimpleFactoryでサンプルとSample2を生成するメソッドの間には特定の接続がありますたとえば、プロセスは統一されています。製造プロセスは比較的単純なため、名前は単純です。
実際のアプリケーションでは、工場の方法がより頻繁に使用され、動的クラスローダーと組み合わされます。
Java Factoryモデルの例
JiveのForumFactoryを例として取り上げましょう。
コードコピーは次のとおりです。
パブリックアブストラクトクラスforumfactory {
private static object initlock = new object();
public static forumfactory getInstance(承認承認){
//有効な承認が渡されなかった場合は、nullを返します。
if(authorization == null){return null;
//次のものでは、シングルトンシングルトンモードを使用します
if(factory == null){
同期(initlock){
if(factory == null){......
試す {
//動的な再版
class c = class.forname(className);
Factory =(forumFactory)c.newinstance();
} catch(例外e){null;
}
}
}
//ここで、フォーラムへの許可されたアクセスを制限するために使用されます
新しいforumfactoryproxy(承認、工場、工場、getpermissions(承認))を返します。
}
//フォーラムを作成する方法は、ForumFactoryを継承するサブクラスによって完了します。
パブリックアブストラクトフォーラムCreateforum(文字列名、文字列の説明)
UnauthorizedException、ForumalReadyExistexceptionをスローします。
...
}
Jiveは現在、データベースシステムを介してフォーラムの投稿やその他のコンテンツデータを保存しているため、ファイルシステムを介して実装するように変更する場合、このFactory Method ForumFactoryは動的インターフェイスを提供します。
コードコピーは次のとおりです。
private static string classname = "com.jivesoftware.forum.database.dbforumfactory";
開発した方法を使用して、com.jivesoftware.forum.database.dbforumfactoryの代わりにフォーラムを作成できます。
上記のコードには、3つのモードがあります。アクセスフォーラム:1つは登録されたユーザーであり、ゲストである場合、対応するアクセス許可は異なり、この許可はシステム全体を確立します。
Java Pet StoreでCatalogdaofactoryをご覧ください。
コードコピーは次のとおりです。
パブリッククラスのcatalogdaofactory {
/**
*この方法は、DAOパターンを実装するための特別なサブクラスを開発します。
*特定のサブクラス定義は、J2EEデプロイメント記述子にあります。
*/
public static catalogdao getdao()はcatalogdaosysexectionをスローします{
catalogdao catdao = null;
試す {
intialitycontext ic = new initialContext();
// catalog_dao_classの動的読み込み
//独自のcatalog_dao_classを定義できるので、コードを変更しすぎる必要はありません
//、巨大なシステムの変更を完了します。
string classname =(string)ic.lookup(jndinames.catalog_dao_class);
catdao =(catalogdao)class.forname(classname).newinstance();
} catch(namingexception ne){
新しいcatalogdaosysexection( "catalogdaofactory.getdao:namingexception whiled dao type: /n" + ne.getmessage())を投げる;
} catch(例外SE){
新しいcatalogdaosysexection( "catalogdaofactory.getdao:dao type: /n" + se.getmessage())を取得しながら例外を投げます。
}
Catdaoを返します。
}
}
Catalogdaofactoryは、典型的な工場の方法です。 。
工場の方法は、特定の工場構造を変更する限り、非常に柔軟で強力な動的拡張メカニズムを提供することがわかります。変換でシステム機能を変更することは可能です。