Javaにおける23のデザインパターン【創造型パターン】の【ファクトリパターン】
文書ディレクトリ設計モード分類 ファクトリモード 工場モード分類: 単純工場モード工場方法モード比較 単純ファクトリモード 要点 コード 工場方法モード 要点: コード アプリケーション:
抽象工場モード 要点 コード まとめ デザインパターン分類作成モード 単例モード、工場モード、抽象工場モード、建設者モード、プロトタイプモード 注目オブジェクトの作成プロセス 構造型モード アダプタモード、ブリッジモード、装飾モード、コンビネーションモード、外観モード、メタモード、プロキシモード 注目オブジェクトとクラスの組織 動作モード テンプレートメソッドモード、コマンドモード、反復器モード、オブザーバモード、仲介モード、メモモード、解釈器モード、ステータスモード、ポリシーモード、責任チェーンモード、訪問者モード .システムとオブジェクトとの相互作用に注目し、システムの実行時オブジェクト間の相互通信と協力を研究し、オブジェクトの職責 をさらに明確にする.
工場モードは、作成者と呼び出し者の分離 を実現した.詳細分類: 単純ファクトリモード(最も一般的) 工場方法モード 抽象工場モード オブジェクト向け設計の基本原則 OCP(開閉原則、Open-Closed Principle):ソフトウェアのエンティティは拡張に対して開放され、修正に対して を閉じるべきである. DIP(依存逆転原則、Dependence Inversion Principle):インタフェースに対してプログラミングするには、実装に対してプログラミングしないでください. LoD(ディミットの法則、Law of Demeter):見知らぬ人との通信を避けるために、直接の友达と通信するだけです.
コア本質 オブジェクトをインスタンス化し、new操作 の代わりにファクトリメソッドを用いる.では、実装クラスが選択され、オブジェクトの統合管理と制御が作成されます.呼び出し者を我々の実装クラスとデカップリングする
工場モデル分類:単純ファクトリモード は、同じ階層内の任意の製品を生産するために使用される.(新しい製品を追加するには、既存のコードを変更する必要があります) ファクトリメソッドモード は、同じ等級構造の固定製品を製造するために使用される.(任意の製品の追加をサポート) 抽象ファクトリモード は、異なる製品ファミリーのすべての製品を生産するために使用される.(新しい製品を追加するには、何もできません.製品ファミリーの追加をサポートします)
単純ファクトリモードとファクトリメソッドモードの比較構造の複雑さ この角度から比較すると、明らかに単純な工場モデルが優れている.単純な工場モデルは1つの工場クラスしか必要としないが、工場方法モデルの工場クラスは製品クラスの個数が増加するにつれて増加し、これは間違いなくクラスの個数をますます多くし、構造の複雑さを増加させる.
コード複雑度(単純ファクトリモード複雑) コードの複雑さと構造の複雑さは矛盾しており、単純な工場モードが構造の面で比較的簡潔である以上、コードの面では工場方法モードよりも複雑であるに違いない.単純ファクトリモードのファクトリクラスは、製品クラスの増加に伴って多くの方法(またはコード)を増加させる必要があるが、ファクトリメソッドモードの各特定のファクトリクラスは単一のタスクのみを完了し、コードは簡潔である. クライアントプログラミングの難易度(単純な工場で簡単) ファクトリメソッドモードは、ファクトリクラス構造にインタフェースを導入してOCPを満たすが、クライアント符号化にはファクトリクラスをインスタンス化する必要がある.単純なファクトリモードのファクトリクラスは静的クラスであり、クライアントでインスタンス化する必要はありません.これは間違いなく魅力的な利点です.
管理上の難易度 拡張性の観点:両者は同様に良好な拡張性を備えているが、単純な工場モードはOCP を完全に満たしていない.メンテナンスの観点:複数の製品クラスを修正する必要がある場合、工場クラスの修正はかなり面倒になります.逆に単純な工場モデルは唯一の工場クラスを変更するだけ(どうしても要求を満たすように変更できるでしょう?このクラスを書き直すことはできません) 推奨事項: 設計理論に基づいて提案:工場方法モデル 実際の開発:一般的に単純工場モデル を使用する
単純ファクトリモード
要点単純ファクトリモードは静的ファクトリモードとも呼ばれる.なぜなら、ファクトリクラスは一般的に静的メソッドを使用し、受信パラメータの違いによって異なるオブジェクトインスタンス を返すからである.新製品の追加にはどうしようもなく、コードを修正できなければ拡張できない です.
コード#コード#インタフェース 特定のクラス(Audi,Byd) 工場類書き方一: 工場類書き方二 工場類書き方三: 呼び出し者: ファクトリメソッドモード
要点:単純ファクトリモードの欠点を回避するために、OCP を完全に満たすファクトリメソッドモードと単純ファクトリモードの最大の違いは、単純ファクトリモードが1つ(プロジェクトまたは独立モジュールの場合)のファクトリクラスのみであり、ファクトリメソッドモードには同じインタフェースを実現するファクトリクラス のセットがあることである.
コード#コード#自動車インタフェースと工場インタフェース 自動車類と工場類 呼び出し者 適用:
新しいものを追加するたびに、そのもののクラスと、そのオブジェクトを作成できるファクトリクラスを作成します.
呼び出し者は、対応するファクトリを介して対応するオブジェクトを作成します.
抽象ファクトリモード
要点は、異なる製品ファミリーのすべての製品を生産するために使用される.(新しい製品を追加するには、何もできません.製品ファミリーの追加をサポートします) 抽象工場モデルは工場メソッドモデルのアップグレードバージョンであり、複数の業務品種、業務分類がある場合、抽象工場モデルによる生産に必要な対象は非常に良い解決方法である.
エンジン
シート
タイヤ
——』一つの製品ファミリー
ハイエンドエンジン
ハイサイドシート
ハイサイドタイヤ
ローエンドエンジン
ローエンドシート
ローエンドタイヤ
コード#コード#
製品ファミリーの各製品には、次のものがあります.抽象クラス(プロダクトモジュール) 製品実現類(具体的な実現) 工場:抽象ファクトリクラス(ファクトリが製品を作成するルール) 工場実現類(規則に従って具体的に製品を生産する) 呼び出し元:工場インタフェースを介して必要な工場を作成する は、対応する製品インタフェースを介して、作成する工場で製品 を生産する.エンジン抽象クラスと実装クラス シート抽象クラスと実装クラス タイヤ抽象クラスと実装クラス 工場抽象類 工場実現類(ハイエンド工場とローエンド工場) クライアント: まとめ工場モデルのポイント: 単純ファクトリモード(静的ファクトリモード) はある程度設計原則に合致しないが、実際に使用するのは最大 である.
ファクトリメソッドモード 既存のクラスを変更することなく、新たなファクトリクラスを追加することで の拡張を実現する.
抽象ファクトリモード 製品を増やすことはできません.製品族 を増やすことができます.
適用シーン JDKにおけるCalendarのgetInstanceメソッド JDBCにおけるConnectionオブジェクトの取得 HibernateでSessionFactory作成Session springにおけるIOCコンテナ作成管理beanオブジェクト XML解析時のDocumentBuilderFactory作成解析器 反射中のClassオブジェクトのnewInstance()
工場モード
工場モデル分類:
単純ファクトリモードとファクトリメソッドモードの比較
単純ファクトリモード
要点
コード#コード#
public interface Car {
void run();
}
//Audi
package simplefactory;
public class Audi implements Car{
@Override
public void run() {
System.out.println(" ");
}
}
//-----------------------------------------------------------------
//Byd
package simplefactory;
public class Byd implements Car{
@Override
public void run() {
System.out.println(" ");
}
}
package simplefactory;
public class CarFactory {
public static Car creatCar(String type) {
if(" ".equals(type)) {
return new Audi();
}else if(" ".equals(type)) {
return new Byd();
}else {
return null;
}
}
}
package simplefactory;
public class CarFactory2 {
public static Car createAudi() {
return new Audi();
}
public static Car createByd() {
return new Byd();
}
}
package simplefactory;
public class CarFactory3 {
public static Car createCar(String type) {
Car c = null;
if(" ".equals(type)) {
c = new Audi();
}else if(" ".equals(type)) {
c = new Byd();
}
return c;
}
}
package simplefactory;
//
public class Client02 {
public static void main(String[] args) {
Car c1 = CarFactory.creatCar(" ");
Car c2 = CarFactory.creatCar(" ");
c1.run();
c2.run();
}
}
要点:
コード#コード#
// ,
package factorymethod;
public interface Car {
void run();
}
// ,
package factorymethod;
public interface CarFactory {
Car createCar();
}
//
package factorymethod;
public class Audi implements Car{
@Override
public void run() {
System.out.println(" ");
}
}
//
package factorymethod;
public class AudiFactory implements CarFactory{
@Override
public Car createCar() {
return new Audi();
}
}
package factorymethod;
public class Client {
public static void main(String[] args) {
Car c1 = new AudiFactory().createCar();//
c1.run();
}
}
新しいものを追加するたびに、そのもののクラスと、そのオブジェクトを作成できるファクトリクラスを作成します.
呼び出し者は、対応するファクトリを介して対応するオブジェクトを作成します.
抽象ファクトリモード
要点
エンジン
シート
タイヤ
——』一つの製品ファミリー
ハイエンドエンジン
ハイサイドシート
ハイサイドタイヤ
ローエンドエンジン
ローエンドシート
ローエンドタイヤ
コード#コード#
製品ファミリーの各製品には、次のものがあります.
//
package abstractFactory;
public interface Engine {
void run();
void start();
}
// (LuxuryEngine ,LowEngine )
class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println(" , ");
}
@Override
public void start() {
System.out.println(" , ! ");
}
}
class LowEngine implements Engine{
@Override
public void run() {
System.out.println(" ");
}
@Override
public void start() {
System.out.println(" , ! ");
}
}
//
package abstractFactory;
public interface Seat {
void massage();
}
// (LuxurySet ,LowSeat )
class LuxurySeat implements Seat{
@Override
public void massage() {
System.out.println(" , ");
}
}
class LowSeat implements Seat{
@Override
public void massage() {
System.out.println(" , ");
}
}
//
package abstractFactory;
public interface Tyre {
void revolve();
}
// (LuxuryTyre ,LowTyre )
class LuxuryTyre implements Tyre{
@Override
public void revolve() {
System.out.println(" , ");
}
}
class LowTyre implements Tyre{
@Override
public void revolve() {
System.out.println(" , ");
}
}
package abstractFactory;
public interface CarFactory {
Engine createEngine();
Seat createSeat();
Tyre createTyre();
}
//
package abstractFactory;
public class LuxuryCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
//
package abstractFactory;
public class LowCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seat createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
package abstractFactory;
public class Client {
public static void main(String[] args) {
CarFactory factory = new LuxuryCarFactory();
Engine e = factory.createEngine();
e.run();
e.start();
}
}
// ————————————————————————————————————————————————————————————
,
, !